std :: указатели unordered_map / аннулирование ссылки

#c #c 11 #language-lawyer #unordered-map

#c #c 11 #язык-юрист #неупорядоченная карта

Вопрос:

У меня есть следующий код:

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

map["k1"] = "v1";
autoamp; v1 = map["k1"];
map["k2"] = "v2";
  

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

Примечания

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

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

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

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

Комментарии:

1. Да, вы правы. Смотрите и здесь .

Ответ №1:

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

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

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

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

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

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

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