2016-06-07 207 views
0

我只是在向量中的迭代器上寫一個測試程序,在開始時我剛創建了一個向量並用一系列數字1-10初始化它。循環與向量中的迭代器

之後,我創建了一個迭代器「myIterator」和一個常量迭代器「iter」。我用它來顯示矢量的內容。

後來我將「myIterator」分配給了「anotherVector.begin()」。所以他們指的是同樣的事情。

與myIterator檢查由

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

所以在第二迭代循環我剛更換 「anotherVector.begin()」。

但是,這產生了不同的輸出。

代碼是:

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; 
} 

使用

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

輸出給出:

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

和輸出使用

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

給出:

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 

如果他們只是指向相同的地址,爲什麼會有這麼多的差別。

回答

3

在您的insert,myIterator不再有效。這是因爲插入到std::vector可能會導致向量重新分配,因此以前迭代器指向的地址可能不會指向重新分配的向量的地址空間。

+0

而不是發佈我自己的答案,因爲你擊敗了我,[這裏是鏈接'vector'迭代器失效](http://en.cppreference.com/w/cpp/container/vector#Iterator_invalidation)以供參考。 – ShadowRanger

+0

感謝它,我已經與地址運營商確認。 –

0

我剛發現我的錯誤,但你可以檢查迭代器地址位置的變化。

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; 

這給出的輸出:

插入

test line 0x92f070 0x92f070 

之前插入

test line 0x92f070 0x92f0f0 

輸出可以根據在機器上發生變化後。

+0

如果您願意分享,是否在示例代碼中發現了明顯的問題? – md5i