@ syam Antwort korrekt ist (1), aber ich denke, dass es nützlich ist, von der nur maßgeblichen Quelle zu zitieren, die C++ 11 Standard:
(§23.2.5/13) Die insert
und emplace
Mitglieder 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 Referenzen auf die gelöschten Elemente ungültig machen.
(§23.2.5/14) Die insert
und emplace
Mitglieder bleiben die Wirksamkeit von Iteratoren beeinflussen, wenn (N + n) < z * B, wobei N die Anzahl der Elemente in dem Behälter vor dem Einfügevorgang ist , n ist die Anzahl der eingefügten Elemente, B ist die Bucket-Anzahl des Containers und z ist der maximale Ladefaktor des Containers.
(dies in Zusammenhang zu bringen. §23.2.5 der Abschnitt über ungeordneten assoziativen Container ist, so gilt sie für std::unordered_set
, std::unordered_map
, std::unordered_multiset
und std::unordered_multimap
) Das bedeutet:
Wenn Sie n
Elemente in eine unordered_map
genannt hash
, können Sie überprüfen, ob
hash.size() + n < hash.max_load_factor() * hash.bucket_count()
einfügen 210 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 diesem Vorgang ungültig gemacht werden, bleiben Verweise auf die Elemente selbst gültig.
Wenn Sie erase
Elemente verwenden, werden nur Iteratoren, die auf diese verweisen, ungültig; Andere Iteratoren bleiben gültig.
Eine nette Referenz für die Iterator-Invalidierung für alle Container ist http: // stackoverflow.com/questions/6438086/iterator-invalidation-rules – JRG