#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:
(выделение мое)
Перефразирование делает недействительными итераторы, изменяет порядок между элементами и изменяет, в каких сегментах отображаются элементы, но не делает недействительными указатели или ссылки на элементы.