Указатели на элементы контейнеров STL

учитывая контейнер STL (вы также можете взять boost::unordered_map и boost::multi_index_container С учетом), который не является непрерывным, гарантируется ли, что адреса памяти элементов внутри контейнера никогда не изменяются, если элемент не удаляется (но новые могут быть добавлены)?

например

class ABC { };
//
//...
//
std::list<ABC> abclist;
ABC abc;
abclist.insert(abc);
ABC * abc_ptr = &(*abclist.begin());

другими словами будут abc_ptr указал abc на протяжении всего исполнения, если я не удаляю abc С abc_list.

Я спрашиваю это, потому что я собираюсь оберните класс ABC в C++ / Cli, поэтому мне нужны указатели на ABC экземпляры в классе-оболочке. ABC-это простой класс, и я хочу, чтобы контейнер обрабатывал память. Если ответ нет, то я буду использовать std::list<ABC*>.

4 ответов


std::list, std::set и std::map гарантируйте, что итераторы (включая простые указатели) не будут признаны недействительными при добавлении или даже удалении нового элемента.


Как упоминал Армен, std::list, std::set и std:: map гарантированно только аннулируют удаленный итератор. В случае boost::unodered_map модификаторы действительно могут аннулировать итераторы.

http://www.boost.org/doc/libs/1_38_0/doc/html/boost/unordered_map.html


стандарт C++ устанавливает строгие правила в отношении достоверности ссылок / итераторов. Для каждого контейнера каждый метод документирует, какие элементы мая быть перемещены (недействительные ссылки и итераторы).

Контейнеры На Основе Узлов:list, map, set, multimap и multiset гарантируйте, что ссылки и итераторы на элементы останутся действительными до тех пор, пока элемент не будет удален из контейнера.

ваш случай использования поэтому один из угловые случаи, когда используется list для хранения хорошо, из-за недействительности гарантирует, что предложение списка.


Я думаю, что лучше использовать std::list <shared_ptr <ABC> > вместо передачи указателя. Рекомендуется делегировать управление памятью (см. Scott meyers effective c++)

Это имеет множество преимуществ:

  • вы можете поделиться ими и передать их без головной боли для их освобождения
  • сбор мусора указателей
  • вы не передаете указатель в первую очередь