Подтвердить что ты не робот

Указатели на элементы контейнеров 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 в С++/Cli, поэтому мне нужны указатели на экземпляры abc в классе-оболочке. ABC - это простой класс, и я хочу, чтобы контейнер обрабатывал память. Если ответ не будет, я буду использовать std::list<ABC*>.

4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

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

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