Considérons le code suivant:
unordered_set<T> S = ...;
for (const auto& x : S)
if (...)
S.insert(...);
C'est cassé correct? Si nous insérer quelque chose dans S alors les itérateurs peuvent être invalidé (due à une resucée), ce qui va casser la fourchette, car sous le capot, c'est à l'aide de S. begin ... S. fin.
Est-il un motif pour traiter ce problème?
Une façon est:
unordered_set<T> S = ...;
vector<T> S2;
for (const auto& x : S)
if (...)
S2.emplace_back(...);
for (auto& x : S2)
S.insert(move(x));
Cela semble maladroit. Est-il un meilleur moyen que je suis absent?
(Plus précisément, si j'ai été en utilisant un roulé à la main de la table de hachage et j'ai pu le bloquer à partir de ressasser jusqu'à la fin de la boucle, il serait plus sûr d'utiliser la première version).
Mise à jour:
À partir de http://en.cppreference.com/w/cpp/container/unordered_map/insert
Si ressasser se produit en raison de l'insertion, tous les itérateurs sont invalidés. Sinon les itérateurs ne sont pas affectés. Les références ne sont pas invalidées. Ressasser se produit uniquement si le nouveau nombre d'éléments est supérieur
max_load_factor() * bucket_count()
.
Pourrait vous gâcher max_load_factor
d'une certaine manière à l'empêcher de ressasser?