Эффективно ли использовать дорогостоящий экземпляр в качестве отображаемого значения в std :: map?

В двух словах, это эффективно использовать

std::map<int, std::set<int> > instead of
std::map<int, boost::shared_ptr<std::set<int>>?

Для вектора я выберу boost :: shared_ptr. Но для std :: map я не уверен, стоит ли это.

0

Решение

Документация для 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() метод и / или перемещение семантики, а не усложнение кода с помощью общего указателя.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]