2012-09-05 11 views
8

Para la mayoría de los contenedores, el tipo iterator proporciona de lectura-escritura acceso a los valores en el recipiente, y el tipo const_iterator proporciona acceso de sólo lectura. Sin embargo, para el std::set<T>, el tipo de iterador no puede proporcionar acceso de lectura-escritura, porque la modificación de un valor en el conjunto (potencialmente) rompe los invariantes del contenedor. Por lo tanto, en std::set<T>, tanto iterator y const_iterator proporcionar acceso de sólo lectura.¿Existe una diferencia operativa entre std :: set :: iterator y std :: set :: const_iterator?

Esto me lleva a mi pregunta: ¿Hay alguna diferencia entre las cosas que puedes hacer con un std::set<T>::iterator y las cosas que puedes hacer con un std::set<T>::const_iterator?

Tenga en cuenta que en C++ 11, los métodos de manipulación de contenedores (por ejemplo, erase) pueden tomar const_iterator argumentos.

Respuesta

6

No, no hay mucha diferencia tanto funcional entre ellos. Por supuesto, hay utiliza de estar de vuelta en C++ 03, cuando set<T>::iterator no arrojó un const T&. Pero una vez que lo cambiaron, se quedaron atrapados con dos tipos diferentes de iteradores que hacen lo mismo.

En efecto, la norma es bastante claro que tienen una funcionalidad idéntica (hasta el punto en que pueden ser del mismo tipo, pero no están obligados a ser). De 23.2.4, p. 6:

iterator de un contenedor asociativo es de la categoría iterador bidireccional. Para contenedores asociativos donde el tipo de valor es el mismo que el tipo de clave, tanto iterator y const_iterator son iteradores constantes. No se especifica si iterator y const_iterator son del mismo tipo. [Nota:iterator y const_iterator tienen una semántica idéntica en este caso, y iterator es convertible a const_iterator. Los usuarios pueden evitar violar la regla de una definición siempre usando const_iterator en sus listas de parámetros de función. - nota final]

1

Cuando nosotros (Err I) portado nuestra gran aplicación para VC 10.0, esta norma entró en efecto. Rompió todo tipo de código antiguo donde la gente manipulaba los iteradores al invocar métodos no const.

Así que conduce a la diferencia más grande que encontré: Sólo puede llamar a los métodos const en un iterador const. Donde, como en el antiguo estándar, podría llamar o no a los métodos no const y estropear su conjunto. En algunos casos, terminé reemplazando algunos conjuntos con mapas donde encontré que el código requería modificaciones en los artículos almacenados en el contenedor.

Espero que ayude.

Cuestiones relacionadas