Können wir unordered_mapT :: iterator speichern?

7

Referenz Ссылка von chetan.j9

%Vor%

Frage & gt; Können wir den Iterator von unordered_map für späteren Abruf speichern? Nach meinem Verständnis wird der Iterator nach dem Einfügen oder Löschen eines Elements ungültig gemacht.

Danke

    
q0987 27.05.2013, 23:41
quelle

2 Antworten

15

@ 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 und emplace 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 und emplace 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:

  1. Wenn Sie n Elemente in ein unordered_map namens hash einfügen möchten, können Sie überprüfen, ob

    %Vor%

    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.

  2. Auch wenn Iteratoren in dieser Operation ungültig gemacht werden, bleiben Verweise auf die Elemente selbst gültig.

  3. Wenn Sie erase -Elemente verwenden, werden nur Iteratoren ungültig, die auf diese Elemente zeigen. Andere Iteratoren bleiben gültig.

jogojapan 28.05.2013 01:25
quelle
5

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.

    
syam 27.05.2013 23:45
quelle

Tags und Links