Escribí este pequeño código solo para ver cómo un iterador realmente se invalida y no apunta a la ubicación cambiada de un vector una vez que se alcanza su capacidad.¿Por qué C++ no se ocupa de los iteradores cuando la inserción se realiza en un vector una vez que se alcanza la capacidad?
Aquí el tamaño del vector y la capacidad son inicialmente 5. Después de eso inserté algunos otros elementos en el vector y no reinicio mi iterador para apuntar a myvector.begin()
. Esto condujo a un valor no deseado de 49
en mi salida después de maximum size of vector is : 1073741823
al imprimir elementos del vector nuevamente.
Mi pregunta es por qué C++ no vuelve a hacer iterador de puntos a un myvector.begin()
válido después de que todos los elementos se hayan copiado en una nueva ubicación.
Esto también puede llevar a un comportamiento que puede ser difícil de depurar. Sé que una forma segura de trabajar sería siempre reiniciar el iterador justo antes de usarlo.
#include<iostream>
#include<vector>
#include<stdio.h>
using namespace std;
int main()
{
vector<int> myvector;
vector<int>::iterator it;
int myarray[]= {100,200,300,400};
myvector.insert(it,500);
it=myvector.begin();
myvector.insert(it,myarray,myarray+4);
it=myvector.begin();
for(;it!=myvector.end();++it)
cout <<*it<<endl;
cout <<"size of vector is :" << myvector.size() <<"\n";
cout <<"capacity of vector is : " << myvector.capacity()<<"\n";
cout <<"maximum size of vector is : " << myvector.max_size()<<"\n";
myvector.push_back(600);
for(;it!=myvector.end();++it)
cout <<*it<<endl;
}
Output of program :-
100
200
300
400
500
size of vector is :5
capacity of vector is : 5
maximum size of vector is : 1073741823
49
100
200
300
400
500
600
[con 'std :: vector' cualquier cosa que cambie el tamaño invalida los iteradores anteriores] (http://stackoverflow.com/a/6438087/168175) – Flexo
@awoodland parece saber eso, creo que está preguntando * por qué * esto está ocurriendo. –
Cada contenedor de STL ofrece ciertas garantías con respecto a la validez de sus iteradores. Vale la pena entender cuándo los iteradores son invalidados para un contenedor dado. Ciertamente no desea siempre restablecer a un nuevo 'begin()' 'just in case'. Consulte aquí para obtener información sobre el 'vector' - http://www.sgi.com/tech/stl/Vector.html –