Рассмотрим следующий код:
unordered_set<T> S = ...;
for (const auto& x : S)
if (...)
S.insert(...);
Это неверно? Если мы вставляем что-то в S, итераторы могут быть недействительными (из-за переименования), что приведет к поломке диапазона, потому что под капотом используется S.begin... S.end.
Есть ли какой-нибудь шаблон, чтобы справиться с этим?
Один из способов:
unordered_set<T> S = ...;
vector<T> S2;
for (const auto& x : S)
if (...)
S2.emplace_back(...);
for (auto& x : S2)
S.insert(move(x));
Это кажется неуклюжим. Есть ли лучший способ, которым я не хватает?
(В частности, если я использовал ручную таблицу хэша, и я мог бы заблокировать ее от повторного воспроизведения до конца цикла, было бы безопасно использовать первую версию.)
Update:
Из http://en.cppreference.com/w/cpp/container/unordered_map/insert
Если повторная запись происходит из-за вставки, все итераторы становятся недействительными. В противном случае итераторы не будут затронуты. Ссылки не являются недействительными. Повторное воспроизведение происходит только в том случае, если новое число элементов больше, чем
max_load_factor() * bucket_count()
.
Не могли бы вы каким-то образом возиться с max_load_factor
, чтобы не перефразировать?