Согласно cppreference,
Повторное хэширование происходит только в том случае, если новое количество элементов больше
max_load_factor()*bucket_count()
.
Кроме того, [unord.req]/15 имеет аналогичные правила. :
Элементы
insert
иemplace
не должны влиять на достоверность итераторов, если(N+n) <= z * B
, гдеN
— количество элементов в контейнере до операции вставки,n
— количество вставленных элементов,B
— количество сегментов контейнера, аz
— количество элементов в контейнере. максимальный коэффициент загрузки контейнера.
Однако рассмотрим следующий пример:
#include <unordered_set>
#include <iostream>
int main()
{
std::unordered_set<int> s;
s.emplace(1);
s.emplace(42);
std::cout << s.bucket_count() << ' ';
std::cout << (3 > s.max_load_factor() * s.bucket_count()) << ' ';
s.emplace(2);
std::cout << s.bucket_count() << ' ';
}
С GCC 8.0.1 он выводит
3 0 7
Это означает, что после замены 2 происходит перефразирование, хотя новое количество элементов (3) не больше max_load_factor()*bucket_count()
(обратите внимание, что второй результат равен 0). Почему это происходит?