Für die meisten Container bietet der Typ iterator
Lese- / Schreibzugriff auf Werte im Container und der Typ const_iterator
bietet schreibgeschützten Zugriff. Für std::set<T>
kann der Iteratortyp jedoch keinen Lese-Schreib-Zugriff bereitstellen, da das Ändern eines Werts in der Gruppe (möglicherweise) die Container-Invarianten aufbricht. Daher stellen sowohl std::set<T>
als auch iterator
in const_iterator
schreibgeschützten Zugriff bereit.
Das führt mich zu meiner Frage: Gibt es einen Unterschied zwischen den Dingen, die man mit einem std::set<T>::iterator
machen kann, und den Dingen, die man mit einem std::set<T>::const_iterator
machen kann?
Beachten Sie, dass in C ++ 11 die Bearbeitungsmethoden von Containern (z. B. erase
) const_iterator
Argumente annehmen können.
Nein, es gibt nicht viel funktionalen Unterschied zwischen ihnen. Natürlich verwendet um wieder in C ++ 03 zu sein, wenn set<T>::iterator
nicht const T&
zurückgibt. Aber als sie es einmal geändert hatten, waren sie mit zwei verschiedenen Arten von Iteratoren beschäftigt, die beide dasselbe tun.
Tatsächlich ist der Standard ziemlich klar, dass sie identische Funktionalität haben (bis zu dem Punkt, wo sie vom selben Typ sein können, aber nicht müssen). Ab 23.2.4, p. 6:
iterator
eines assoziativen Containers gehört zur bidirektionalen Iteratorkategorie. Bei assoziativen Containern, bei denen der Werttyp dem Schlüsseltyp entspricht, sind sowohliterator
als auchconst_iterator
konstante Iteratoren. Es ist nicht definiert, obiterator
undconst_iterator
vom selben Typ sind. [ Hinweis:iterator
undconst_iterator
haben in diesem Fall identische Semantik unditerator
ist inconst_iterator
konvertierbar. Benutzer können die Verletzung der Regel für eine Definition vermeiden, indem sie in ihren Funktionsparameterlisten immerconst_iterator
verwenden. - Endnote ]
Als wir (Err I) unsere große App auf VC 10.0 portierten, wurde diese Regel wirksam. Es hat alle Arten von altem Code durchbrochen, wo Leute die Iteratoren manipuliert haben, indem sie nicht-konstante Methoden auf ihnen aufgerufen haben.
Das führt zu dem größten Unterschied, den ich gefunden habe: Sie können const-Methoden nur auf einem konstanten Iterator aufrufen. Wo - wie im alten Standard - könnte man wohl non-const Methoden aufrufen und sein Set durcheinander bringen. In einigen Fällen habe ich am Ende einige Sets durch Maps ersetzt, wo ich den Code gefunden habe, der absolut notwendig ist, um die Objekte zu verändern, die im Container gespeichert werden.
Ich hoffe, das hilft.
Tags und Links c++ c++11 set iterator containers