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