@ syams Antwort ist korrekt (+1), aber ich denke, es ist nützlich, aus der einzigen maßgeblichen Quelle, dem C ++ 11 Standard, zu zitieren:
(§23.2.5 / 13) Die Member
insert
undemplace
dürfen die Gültigkeit von Verweisen auf Containerelemente nicht beeinflussen, können jedoch alle Iteratoren für den Container ungültig machen. Die Löschelemente sollen nur Iteratoren und Verweise auf die gelöschten Elemente ungültig machen.(§23.2.5 / 14) Die Mitglieder
insert
undemplace
dürfen die Gültigkeit von Iteratoren nicht beeinflussen, wenn (N + n) & lt; z * B, wobei N die Anzahl der Elemente im Container vor der Einfügeoperation ist, n die Anzahl der eingefügten Elemente, B die Bucket-Anzahl des Containers und z der maximale Ladefaktor des Containers ist.
(Um dies in Kontext zu setzen: §23.2.5 ist der Abschnitt über ungeordnete assoziative Container, so gilt es für std::unordered_set
, std::unordered_map
, std::unordered_multiset
und std::unordered_multimap
.)
Das bedeutet:
Wenn Sie n
Elemente in ein unordered_map
namens hash
einfügen möchten, können Sie überprüfen, ob
ist wahr. Wenn es falsch ist, werden alle Iteratoren während des Einfügens ungültig gemacht. Wenn dies der Fall ist, bleiben Iteratoren gültig.
Auch wenn Iteratoren in dieser Operation ungültig gemacht werden, bleiben Verweise auf die Elemente selbst gültig.
Wenn Sie erase
-Elemente verwenden, werden nur Iteratoren ungültig, die auf diese Elemente zeigen. Andere Iteratoren bleiben gültig.
Das Einfügen eines Elements macht alle Iteratoren nur dann ungültig, wenn eine erneute Hash-Operation durchgeführt wird (dh wenn die neue Anzahl von Elementen größer oder gleich max_load_factor()*bucket_count()
ist). Andernfalls werden keine Iteratoren ungültig gemacht.
Durch das Entfernen eines Elements werden die Iteratoren nur für das / die entfernte (n) Element (e) ungültig, nicht für andere nicht verwandte Elemente.
Quelle: std::unordered_map::insert
und std::unordered_map::erase
.
Natürlich gelten diese Regeln nur für std::unordered_map
. Für andere Container gelten möglicherweise andere Regeln für die Ungültigkeitserklärung. Es liegt an Ihnen, dies in der Dokumentation nachzulesen.
Tags und Links c++