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

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

1 ответ

Решение

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

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

(акцент мой)

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

По стандарту $23.2.6/9 Неупорядоченные ассоциативные контейнеры [unord.req]:

(акцент мой)

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

Другие вопросы по тегам