std::unordered map
необычно тем, что правила аннулирования итераторов НЕ применяются к ссылкам на элементы (исключая удаление, но что вы можете сделать, когда элемент пропал?). Изменение емкости не важно. Проблема в том, когда unordered map
перезагружается. Перефразировка сделает недействительными все итераторы, но не сделает недействительными ссылки.
С пункта 9 [unord.req] в стандарте C ++ (со ссылкой на n4618, потому что это то, что у меня под рукой в данный момент),
Элементы неупорядоченного ассоциативного контейнера организованы в ведра . Ключи с одинаковым хеш-кодом появляются в том же сегменте. Количество сегментов автоматически увеличивается при добавлении элементов в неупорядоченный ассоциативный контейнер, так что среднее количество элементов в сегменте остается ниже границы. Перефразировка делает недействительными итераторы, изменяет порядок элементов и изменения, в которых элементы сегментов появляются, , но не делает недействительными указатели или ссылки на элементы. Для unordered_multiset
и unordered_multimap
перефразировка сохраняет относительный порядок эквивалентных элементов. ,
Ударная мина