for c++ stl iterator const-iterator

for - size vector in c++



¿Cuál es la diferencia entre const_iterator e iterator? (3)

En cuanto a rendimiento, no hay diferencia. El único propósito de tener const_iterator sobre el iterator es administrar la const_iterator del contenedor en el que se ejecuta el iterador respectivo. Puedes entenderlo más claramente con un ejemplo:

std::vector<int> integers{ 3, 4, 56, 6, 778 };

Si tuviéramos que leer y escribir los miembros de un contenedor usaremos iterator:

for( std::vector<int>::iterator it = integers.begin() ; it != integers.end() ; ++it ) {*it = 4; std::cout << *it << std::endl; }

Si tuviéramos que leer únicamente los miembros de los integers del contenedor, es posible que desee usar const_iterator, que no permite escribir o modificar los miembros del contenedor.

for( std::vector<int>::const_iterator it = integers.begin() ; it != integers.end() ; ++it ) { cout << *it << endl; }

NOTA: si intenta modificar el contenido usando * it en el segundo caso, recibirá un error porque es de solo lectura.

Cuál es la diferencia entre estos dos con respecto a la implementación dentro de STL. ¿Cuál es la diferencia con respecto al rendimiento? Supongo que cuando estamos atravesando el vector en "solo leer", preferimos const_iterator , ¿verdad?

Gracias.


No hay diferencia de rendimiento

Un const_iterator es un iterador que apunta al valor const (como un puntero const T* ); desreferenciación devuelve una referencia a un valor constante ( const T& ) y evita la modificación del valor al que se hace referencia: impone const-correctness .

Cuando tiene una referencia constante al contenedor, solo puede obtener un const_iterator .

Editado: const_iterator "El const_iterator devuelve punteros constantes" que no es exacto, gracias a Brandon por señalarlo.

Editar: para los objetos COW, obtener un iterador no const (o desreferenciarlo) probablemente desencadenará la copia. (Algunas implementaciones obsoletas y ahora no permitidas de std::string usan COW).


si tiene una lista a y luego las siguientes declaraciones

list<int>::iterator it; // declare an iterator list<int>::const_iterator cit; // declare an const iterator it=a.begin(); cit=a.begin();

puede cambiar el contenido del elemento en la lista usando "it" pero no "cit", es decir, puede usar "cit" para leer los contenidos, no para actualizar los elementos.

*it=*it+1;//returns no error *cit=*cit+1;//this will return error