首頁  >  問答  >  主體

c++ iterator 在迭代时push_back报错.

#include <vector>
#include <stdio.h>
#include <iostream>

using namespace std;
int main(){
        vector<int > v;
        auto iter = v.begin();
        vector<int>::iterator iter2=v.begin();
        v.push_back(4);
        cout<<"int0  "<<v[0]<<endl;
        cout<<"iter2"<<*iter2<<endl; //到这里就报错.为什么?
        cout<<"int"<<*iter<<endl;
        return 0;
}

g++ iterTest.cpp -std=c++11 -o iterTest

怪我咯怪我咯2715 天前765

全部回覆(3)我來回復

  • PHP中文网

    PHP中文网2017-04-17 12:08:15

    一般情況下,迭代過程中不允許修改資料來源,如果資料來源變化,必須重新迭代

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-17 12:08:15

    #include <vector>
    #include <stdio.h>
    #include <iostream>
    using namespace std;
    
    int main(){
            vector<int> v;
            v.push_back(4);
            vector<int>::iterator iter2=v.begin();
            auto iter = v.begin();
            cout<<"int0  "<<v[0]<<endl;
            cout<<"iter2"<<*iter2<<endl; //到这里就报错.为什么?
            cout<<"int"<<*iter<<endl;
            return 0;
    }

    這樣就好了。

    因為vector是動態成長的容器,當建立一個容器v,此時裡面的元素為空,且capacity容量也為0,此時執行begin()傳回的迭代器與end()傳回的相同。接著向裡面新增元素時,標準函式庫會自動為其新分配一段可以容納該元素的記憶體空間,並將該元素儲存進去,先前的迭代器就失效了。所以解引用時,該迭代器所指的位置並沒有元素,報錯。

    回覆
    0
  • 高洛峰

    高洛峰2017-04-17 12:08:15

    int main(){
            vector<int > v;
            v.push_back(4);
            vector<int>::iterator iter2=v.begin();
            cout<<"iter2"<<*iter2<<endl;
            return 0;
    }
    

    程式碼如上調整,因為v.begin()指向的是vector的第一個元素,而你vector v初始化的時候裡面並沒有插入任何數值,vector為空,所以你運行時出錯,你必須插入至少一個元素後,再用v.begin()去實例化iterator的值,才能確保指向的迭代器是正確的迭代器

    回覆
    0
  • 取消回覆