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