Wie ändern von Schlüssel-Werte, die in std::map container
Gegeben
std::map<int,std::string> myMap;
fillMyMapWithStuff(myMap);
//modify key values - I need to add a constant value to each key
for (std::map<int,std::string>::iterator mi=myMap.begin(); mi != myMap.end(); ++mi)
{
//...
}
Was ist eine gute Art und Weise anwenden einige re-Indizierung? Muss ich entfernen Sie den alten Eintrag und fügen Sie eine neue mit dem neuen key und der alte Wert?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sieht aus wie Sie besser, Bau eine neue Karte und tauschen es danach. Sie müssen nur
n
insert-Operationen stattn
Streichungen undn
Einfügungen.Ja, Sie müssen entfernen Sie den alten Eintrag und fügen Sie eine neue mit dem neuen Schlüssel. Die Tasten sind nicht änderbar.
Wenn Sie die änderung nur einer oder ein paar Elemente, die Sie es tun könnten effizient durch hinting
map::insert
mit der position des neuen Elements. Seit Sie Ihren neuen Schlüssel sind sicher, dass sich irgendwo nach den alten Schlüssel, und Sie können Hinweis mit dem iterator verweist auf das alte element. Allerdings müssten Sie kümmern sich nicht um die re-Evaluierung der frisch eingefügten Schlüssel (durch Durchlaufen Ende nach vorne zum Beispiel), und im Falle der änderung der gesamten Karte, es ist effizienter, nur ein neues bauen.Ja, Sie müssen. Der Schlüssel ist const, während es in der Karte.
Denke ich, werden Sie haben, um den Bau einer neuen Karte. Wenn Sie löschen und hinzufügen neuer Schlüssel in der Schleife, es zerstört die Integrität der Iteration über der Menge der alten Schlüssel, und nicht berühren, die gerade eingefügten Schlüssel. (Es sei denn, Sie wissen, wie Sie Ihre Schlüssel verteilt werden und stellen Sie Ihre eigene Logik in gibt.)
Gibt es eine weitere option. Wenn dieser Betrieb ist ein wesentliches Merkmal Ihrer Sammlung, und Leistung ist wichtig, Sie können, vermeiden Sie das kopieren der Karte insgesamt. Sie können eine Klasse erstellen überlastung
operator[]
sowie andere Zugriffsmethoden und Mutatoren, und fügen Sie die aktuelle Verschiebung der key-Wert.