2010-11-24 10 views
4

Wenn ich über std::map<X,std::vector<Y> > iterieren, kann ich die Vektoren sortieren, oder könnte das den Iterator ungültig machen?Iterieren über Std :: Map <X, Std :: Vektor <Y>> und Sortieren der Vektoren

Mit anderen Worten, ist der folgende Code in Ordnung?

typedef std::map<int, std::vector<int> > Map; 
Map m; 
for (Map::iterator it = m.begin(); it != m.end(); ++it) { 
    std::sort(it->second.begin(), it->second.end()); 
} 

Antwort

6

Ihr Code ist in Ordnung. Iteratoren von map werden nur ungültig, wenn Sie Elemente aus der Karte entfernen. Durch das Ändern eines Elements eines STL-Containers werden die Iteratoren dieses Containers nicht ungültig. Es werden nur Operationen für den Container selbst ausgeführt, z. B. Entfernen oder Hinzufügen von Elementen.

+2

Das ist ein wenig vage und sogar irreführend. Re "Iteratoren von einer Map werden nur ungültig, wenn Sie Elemente entfernen" - nur Iteratoren für die spezifischen Elemente, die entfernt wurden, werden ungültig gemacht. Re STL-Container im Allgemeinen, und ihre Iteratoren werden nur durch "Entfernen oder manchmal Hinzufügen von Elementen" ungültig - keiner dieser Vorgänge macht Iteratoren in std :: map, std :: multimap, std :: set usw. ungültig. –

2

Ihr Code ist völlig in Ordnung. Eigentlich sollten Sie keinen Zweifel haben, da Sie keine Elemente aus der map einfügen oder entfernen: Die Struktur der map ist unverändert, Sie betreffen nur die gespeicherten Werte.

0

Wie aschepler sagt, ist Ihr Code in Ordnung. Ich würde nur hinzufügen, dass es einen Unterschied zwischen einem Vektor, den die Karte als Ziel hat, und den Werten innerhalb eines der Vektoren gibt. Aus diesem Grund können Sie die Werte innerhalb der Vektoren ändern, ohne die Karte zu beeinflussen.

+0

Ich bin nicht sicher, über welche Unterscheidung du sprichst ... könntest du klären? – HighCommander4

2

Einige Fehlinformationen hier, also wird chippen. Std :: maps sind etwas Besonderes, da Sie neue Elemente einfügen können, ohne bestehende Iteratoren zu entwerten, und das Entfernen eines Elements macht nur Iteratoren für dieses spezifische Element ungültig. Bei einem Iterator in der Map dürfen Sie den Schlüssel nicht ändern (andernfalls wäre die Sortierreihenfolge beschädigt - eine der Invarianten des Containers), Sie können die Werte jedoch beliebig ändern. Ihre Array-Sortierung fällt in diese letzte Kategorie von Operationen und ist völlig in Ordnung.

von der SGI STL Seite zu zitieren: http://www.sgi.com/tech/stl/Map.html

Map hat die wichtige Eigenschaft, dass ein neues Element in eine Karte nicht ungültig Iteratoren einlegen, das auf bestehende Elemente verweisen. Das Löschen eines Elements aus einer Map macht auch keine Iteratoren ungültig, außer natürlich für Iteratoren, die tatsächlich auf das Element zeigen, das gelöscht wird.

Verwandte Themen