2016-06-07 10 views
0

Ich schrieb gerade ein Testprogramm auf Iteratoren in Vektor, Am Anfang hatte ich gerade einen Vektor erstellt und initialisierte es mit einer Reihe von Zahlen 1-10.Schleife mit Iterator in einem Vektor

Danach hatte ich einen Iterator "MyIterator" und einen Const-Iterator "Iter" erstellt. Ich hatte iter benutzt, um den Inhalt des Vektors anzuzeigen.

Später hatte ich "myIterator" zu "anotherVector.begin()" zugewiesen. Sie zeigen also auf dasselbe.

von

//cout << /* *myIterator << */"\t" << *(anotherVector.begin()) << endl; 
geprüft

so in der zweiten Schleife Iterator i gerade ersetzt "anotherVector.begin()" mit myIterator.

Aber das produzierte eine andere Ausgabe.

Code ist:

vector<int> anotherVector; 

for(int i = 0; i < 10; i++) { 
    intVector.push_back(i + 1); 
    cout << anotherVector[i] << endl; 
} 

    cout << "anotherVector" << endl; 

//************************************* 
//Iterators 

cout << "Iterators" << endl; 

vector<int>::iterator myIterator; 
vector<int>::const_iterator iter; 

for(iter = anotherVector.begin(); iter != anotherVector.end(); ++iter) { 
    cout << *iter << endl; 
} 

cout << "Another insertion" << endl; 

myIterator = anotherVector.begin(); 

//cout << /* *myIterator << */"\t" << *(anotherVector.begin()) << endl; 

myIterator[5] = 255; 
anotherVector.insert(anotherVector.begin(),200); 

//for(iter = myIterator; iter != anotherVector.end(); ++iter) { 
    //cout << *iter << endl; 
//} 

for(iter = anotherVector.begin(); iter != anotherVector.end(); ++iter) { 
    cout << *iter << endl; 
} 

Ausgabe mit

for(iter = anotherVector.begin(); iter != anotherVector.end(); ++iter) { 
    cout << *iter << endl; 
} 

gibt:

Iterators 
    1 
    2 
    3 
    4 
    5 
    6 
    7 
    8 
    9 
    10 
    Another insertion 
    200 
    1 
    2 
    3 
    4 
    5 
    255 
    7 
    8 
    9 
    10 

und Ausgang mit

for(iter = myIterator; iter != anotherVector.end(); ++iter) { 
    cout << *iter << endl; 
} 

gibt:

Iterators 
    1 
    2 
    3 
    4 
    5 
    6 
    7 
    8 
    9 
    10 
    Another insertion 
    0 
    0 
    3 
    4 
    5 
    255 
    7 
    8 
    9 
    10 
    81 
    0 
    1 
    2 
    3 
    4 
    5 
    6 
    7 
    8 
    9 
    10 
    0 
    0 
    0 
    0 
    0 
    0 
    0 
    0 
    97 
    0 
    200 
    1 
    2 
    3 
    4 
    5 
    255 
    7 
    8 
    9 
    10 

Warum gibt es so viel Unterschied, wenn sie nur die gleiche Adresse zeigen.

Antwort

3

Nach Ihrer insert ist myIterator nicht mehr unbedingt gültig. Dies liegt daran, dass das Einfügen in eine std::vector eine Neuzuweisung von Vektoren verursachen kann und daher die Adressen, auf die von früheren Iteratoren verwiesen wird, nicht in den Adressraum des neu zugeordneten Vektors zeigen.

+0

Anstatt meine eigene Antwort zu veröffentlichen, da Sie mich dazu schlagen, [hier ist der Link auf 'Vektor' Iterator Invalidation] (http://en.cppreference.com/w/cpp/container/vector#Iterator_invalidation) als Referenz . – ShadowRanger

+0

danke dafür, ich hatte es mit dem Adress-Operator bestätigt. –

0

Ich habe gerade meinen Fehler gefunden, aber Sie können die Variation in der Adresse der Iteratoren überprüfen.

myIterator = anotherVector.begin(); 

    cout << "test line\t" << &(*myIterator) << "\t" << &(*(anotherVector.begin())) << endl; 

    //myIterator[5] = 255; 
    anotherVector.insert(anotherVector.begin(),200); 

    cout << "test line\t" << &(*myIterator) << "\t" << &(*(anotherVector.begin())) << endl; 

Dies gibt die Ausgabe:

vor dem Einsetzen

test line 0x92f070 0x92f070 

nach dem Einsetzen

test line 0x92f070 0x92f0f0 

Ausgang in Abhängigkeit von der Maschine variieren.

+0

Wenn Sie etwas teilen möchten, ist das Problem, das Sie im Beispielcode gefunden haben, offensichtlich? – md5i