So ändern Sie die Schlüsselwerte im Container std :: map

7

Gegeben

%Vor%

Was ist eine gute Methode, eine Neuindizierung durchzuführen? Muss ich den alten Eintrag entfernen und einen neuen mit dem neuen Schlüssel und dem alten Wert hinzufügen?

    
Justicle 07.10.2010, 18:13
quelle

5 Antworten

8

Sieht so aus, als ob Sie besser eine neue Karte erstellen und sie später austauschen sollten. Sie haben nur n einfügen Operationen anstelle von n Löschungen und n Einfügungen.

    
Alex Emelianov 07.10.2010, 18:23
quelle
5

Ja, Sie müssen den alten Eintrag entfernen und einen neuen mit dem neuen Schlüssel hinzufügen. Schlüssel sind nicht änderbar.

Wenn Sie nur ein oder wenige Elemente modifizieren, können Sie dies effizient tun, indem Sie map::insert mit der Position des neuen Elements angeben. Da sich Ihre neuen Schlüssel sicher irgendwo hinter den alten Schlüsseln befinden, können Sie einen Hinweis auf den Iterator geben, der auf das alte Element zeigt. Allerdings müssen Sie darauf achten, die neu eingefügten Schlüssel nicht neu zu bewerten (indem Sie beispielsweise von vorne nach vorne iterieren). Wenn Sie die gesamte Karte ändern, ist es effizienter, einfach eine neue zu erstellen.

    
Cubbi 07.10.2010 18:21
quelle
3

Ja, du musst. Der Schlüssel ist const, solange er sich in der Karte befindet.

    
gregg 07.10.2010 18:20
quelle
2

Ich denke, du musst eine neue Karte erstellen. Wenn Sie innerhalb der Schleife neue Schlüssel löschen und hinzufügen, kann dies die Integrität des Iterierens über die alten Schlüssel zerstören und die gerade eingefügten Schlüssel nicht berühren. (Es sei denn, Sie wissen, wie Ihre Schlüssel verteilt sind und legen Sie Ihre eigene Logik hinein.)

%Vor%     
highBandWidth 07.10.2010 18:26
quelle
2

Es gibt noch eine weitere Option. Wenn diese Operation ein wichtiges Merkmal Ihrer Sammlung ist und die Leistung wichtig ist, können Sie vermeiden, die Karte vollständig zu kopieren. Sie können eine Klasse erstellen, die operator[] sowie andere Zugriffsmethoden und Mutatoren überlädt, und die aktuelle Verschiebung des Schlüsselwerts hinzufügen.

    
Alex Emelianov 07.10.2010 18:34
quelle

Tags und Links