В двух словах, это эффективно использовать
std::map<int, std::set<int> > instead of
std::map<int, boost::shared_ptr<std::set<int>>?
Для вектора я выберу boost :: shared_ptr. Но для std :: map я не уверен, стоит ли это.
Документация для std::map::insert()
говорит http://en.cppreference.com/w/cpp/container/map/insert:
Никакие итераторы или ссылки не являются недействительными.
За std::map::erase()
http://en.cppreference.com/w/cpp/container/map/erase
Ссылки и итераторы на стертые элементы становятся недействительными. Другие ссылки и итераторы не затрагиваются.
Это означает, что ни вставка, ни стирание не перемещают объекты, поэтому вам не нужно беспокоиться о расходах на копирование, за исключением случая, когда вам нужно вставить уже созданный большой объект в карту. Но в этом случае я бы использовал std::map::emplace()
метод и / или перемещение семантики, а не усложнение кода с помощью общего указателя.
Других решений пока нет …