2016-10-05 9 views
6

У меня есть следующий код:станда :: unordered_map указатели/ссылка недействительность

std::unordered_map<std::string, std::string> map; 

map["k1"] = "v1"; 
auto& v1 = map["k1"]; 
map["k2"] = "v2"; 

После прочтения http://en.cppreference.com/w/cpp/container/unordered_map

Примечания

Функция замены не нарушает какое-либо из итераторы внутри контейнер, но они делают недействительным итератор, обозначающий конец области подкачки.

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

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

Является ли моя интерпретация этой цитаты правильной? Можно ли использовать ссылки/указатели значений из карты после изменения карты (очевидно, стирание самого значения приведет к аннулированию ссылки/указателя)?

+2

Да, вы правы. См. [Здесь] (http://en.cppreference.com/w/cpp/container/unordered_map/operator_at). –

ответ

8

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

Да, std::unordered_map::operator[] не отменяет ссылок, даже происходит переосмысление.

(курсив мой)

Если вставка происходит и приводит к перепевам контейнера, все итераторы становятся недействительными. В противном случае итераторы не будут затронуты. Ссылки не являются недействительными..

От стандарта, $23.2.6/9 Unordered associative containers [unord.req]:

(курсив мой)

Rehashing аннулирует итераторы, изменения заказа между элементами, а также изменения, которые ведрами элементы появляются, но не отменяет указатели или ссылки на элементы.

 Смежные вопросы

  • Нет связанных вопросов^_^