Ho scritto questo piccolo codice solo per vedere come un iteratore viene effettivamente invalidato e non punta alla posizione modificata di un vettore dopo che è stata raggiunta la sua capacità.Perché C++ non si occupa degli iteratori quando l'inserimento viene eseguito in un vettore dopo aver raggiunto la capacità?
Qui le dimensioni del vettore e della capacità sono inizialmente 5. Dopo di che ho inserito alcuni altri elementi nel vettore e non reinizializza il mio iteratore in modo che punti a myvector.begin()
. Ciò ha comportato un valore indesiderato di 49
nell'output dopo maximum size of vector is : 1073741823
quando si stampano di nuovo elementi vettoriali.
La mia domanda è perché C++ non rende nuovamente l'iteratore di punti a uno myvector.begin()
valido dopo che tutti gli elementi sono stati copiati in una nuova posizione?
Ciò può anche portare a un comportamento che può essere difficile da eseguire il debug. So che un modo sicuro per lavorare sarebbe quello di reinizializzare sempre l'iteratore prima di 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' tutto ciò che cambia la dimensione invalida precedenti iteratori] (http://stackoverflow.com/a/6438087/168175) – Flexo
@awoodland sembra sapere che, penso che stia chiedendo * perché * sta succedendo questo. –
Ogni contenitore STL fornisce determinate garanzie sulla validità dei suoi iteratori. Vale la pena capire quando gli iteratori sono invalidati per un determinato contenitore. Certamente non vuoi reimpostare sempre su un nuovo 'begin()' 'nel caso'. Vedi qui per info re 'vector' - http://www.sgi.com/tech/stl/Vector.html –