Gibt es einen operationalen Unterschied zwischen std :: set :: iterator und std :: set :: const_iterator?

9

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.

    
John Bartholomew 05.09.2012, 14:05
quelle

2 Antworten

7

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 sowohl iterator als auch const_iterator konstante Iteratoren. Es ist nicht definiert, ob iterator und const_iterator vom selben Typ sind. [ Hinweis: iterator und const_iterator haben in diesem Fall identische Semantik und iterator ist in const_iterator konvertierbar. Benutzer können die Verletzung der Regel für eine Definition vermeiden, indem sie in ihren Funktionsparameterlisten immer const_iterator verwenden. - Endnote ]

    
Nicol Bolas 05.09.2012, 14:10
quelle
1

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.

    
C Johnson 06.09.2012 01:11
quelle

Tags und Links