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

Std:: 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 можно безопасно использовать после вставки новых значений, даже если во время вставки может произойти повторное хеширование.

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

4b9b3361

Ответ 1

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

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

(выделение мое)

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

Из стандарта [unord.req]/9:

(выделение мое)

Перефразировка делает недействительными итераторы, изменяет порядок элементов и изменения, в которых появляются элементы сегментов, но не делает недействительными указатели или ссылки на элементы.