c ++ const auf einer Sammlung

8

Ich war überrascht, als die Erklärung:

%Vor%

würde es mir nicht erlauben, nicht-konstante Methoden auf Foo * aufzurufen. Ich dachte, dass const auf die Sammlung selbst angewendet würde (d. H., Keine Elemente könnten hinzugefügt oder entfernt werden). Ich würde denken, der Weg, um Artikel Const zu vermitteln wäre:

%Vor%

Es scheint, dass das const im ersten Code-Snippet auf den Inhalt der Map verteilt ist und nicht nur auf die Collection zutrifft.

Fehle ich hier etwas? Es scheint kontraintuitiv zu sein. Wie kann ich nicht-konstante Methoden auf den Foo * -Objekten in der ersten Deklaration aufrufen?

    
Dan 04.08.2011, 19:46
quelle

2 Antworten

6

Sie müssen etwas falsch machen - operator[] auf std::map wird nicht als const deklariert und kann daher nicht für den Zugriff auf Elemente der Karte verwendet werden. Der Grund dafür ist nicht const , denn wenn der Schlüssel nicht in der Map vorhanden ist, wird er mit einem standardkonstruierten Wert zur Map hinzugefügt und ändert dabei die Map.

Verwenden Sie stattdessen die Methode find , um einen Iterator zu erhalten. Der zurückgegebene Iterator kann nicht zum Ändern der Map verwendet werden, aber er kann zum Ändern der Objekte verwendet werden, auf die die Werte zeigen. Der folgende Code kompiliert und gibt beispielsweise 4 :

aus %Vor%     
Adam Rosenfield 04.08.2011, 19:56
quelle
2

Ihr std::map wird als const deklariert. Sie erhalten wahrscheinlich nur const iterators daraus.

Sie können [] auch nicht für std::map verwenden, da dies einen Verweis auf das map-Element zurückgibt, was bedeutet, dass Sie es ändern könnten - daher handelt es sich um einen Compilerfehler.

Um Ihre Frage zu vervollständigen, setzt std::map trotzdem seinen Schlüsseltyp: std::map<double, Foo*>::value_type ist std::pair<const double, Foo*> . Wenn Sie dem Schlüsseltyp const hinzufügen, wird const const double einfach auf const double reduziert.

    
user195488 04.08.2011 19:54
quelle

Tags und Links