@ odpowiedź Syam jest prawidłowa (+1), ale myślę, że jest to przydatne zacytować z jedynego wiarygodnego źródła, C++ 11 standardowa:
(§23.2.5/13) insert
oraz emplace
elementy nie mają wpływu na ważność odniesień do elementów kontenera, ale mogą unieważnić wszystkie iteratory do kontenera. Członkowie kasowania unieważniają tylko iteratory i odniesienia do wymazanych elementów.
(§23.2.5/14) insert
i emplace
użytkownicy nie mają wpływu na ważność iteratorami jeśli (N + N) < oo * A, gdzie N oznacza liczbę elementów w pojemniku przed operacją wkładki , n to liczba wstawionych elementów, B to liczba pojemników w pojemniku, a z to maksymalny współczynnik obciążenia kontenera.
(Aby umieścić to w kontekście:. §23.2.5 jest sekcja na nieuporządkowanych kontenerów asocjacyjnych, więc ma ona zastosowanie do std::unordered_set
, std::unordered_map
, std::unordered_multiset
i std::unordered_multimap
) To znaczy:
Jeśli chcesz wstawić n
elementów w produkt unordered_map
nazywa hash
można sprawdzić, czy
hash.size() + n < hash.max_load_factor() * hash.bucket_count()
jest prawdziwe. Jeśli jest false, wszystkie iteratory zostaną unieważnione podczas wstawiania. Jeśli true, iteratory pozostaną ważne.
Nawet jeśli w tej operacji translatory zostaną unieważnione, odniesień do samych elementów pozostanie ważne.
W przypadku elementów erase
tylko iteratory wskazujące na te zostaną unieważnione; inne iteratory pozostaną ważne.
Miłym odniesieniem do unieważniania iteratora dla wszystkich kontenerów jest http: // stackoverflow.com/questions/6438086/iterator-invalidation-rules – JRG