CSTL vector迭代器求助

時間 2022-02-13 03:00:03

1樓:烽風鋒

簡單來說就是迭代器失效了,vector是動態陣列,新增元素時,如果原來預留的空間不夠,就會重新分配記憶體,然後把原來的元素拷貝構造過去,而一旦重新分配記憶體,原來的迭代器就會失效。

很明顯, a.push_back(2);之後,記憶體重新分配了,原來的迭代器失效了。

解決方法,重新獲取迭代器,你要牢記,對於vector而言,任何新增元素的動作,都有可能導致記憶體重新分配,原來的迭代器都要重新獲取才能保持正確性。

進行一下修改就可以了:

pos=a.begin();

fprintf(fpout,"%d\n",*pos);

a.push_back(2);

pos=a.begin();

fprintf(fpout,"%d\n",*pos);

2樓:

這個問題是這樣的,應該是這樣吧

vector是什麼呢,是一個可以隨機訪問的順序表,你可以想象為就是一個稍稍高階點的陣列吧

push_back的作用是向陣列的末尾插入一個值

不過你要注意啊,陣列和連結串列是有很大區別的,連結串列是不能隨機訪問的,第一個元素和第二個元素可能相距很遠,這個明白吧?陣列是可以順序的隨機訪問的,第一個值的下一個地址就是第二個值,這個明白吧?

你首先push_back了一個1,vector是很笨的,它這時候可能就申請了一個空間,也就是相當於內部用new動態分配了一個int的空間,這個空間的起始地址就是你的變數pos

然後你又push_back了一個2,這樣vector就放不下了啊,因為剛剛只申請了一個空間,所以這個時候要再申請至少兩個空間,然後先把之前pos位置的老的值賦值到新空間裡面,然後再在新空間裡面push_back你的2。

因為這裡出現了兩次空間申請,兩次new出來的地址當然不可能是一樣的了,所以也就導致了最後pos和begin差距一定的數值⋯⋯這個16這個數字也有可能是其他數字啦,因為動態new出來的空間不一定就很有準(雖然說你每次執行你這個程式可能都得到16,但是你要是在兩次push_back之間再new或者怎麼樣,應該就會差不少了),你只要明白為什麼差距是因為這是兩次空間申請,明白為什麼,就行了。

VB牛頓迭代法解方程,求助 用vb寫牛頓迭代法程式解方程

常映寒黃彥 設f x 2x 3 4x 2 3x 6,對它求導的f x 6x 2 8x 3 根據牛頓迭代公式令x k 1 x k f x k f x k 然後將x 0 1.5代入方程 xf x f x 1.5 3.75 4.52.33333333 2.2963 17.0000 2.19826 方程的根...

求助點菸器保險絲多少a的,求助 點菸器保險絲多少A的

一般十個安,具體看您原車上是多少 你好,一般是15a的。 你好,小車一般都是15a 正常10個和7.5的 並不是全部都一樣 一般汽車點菸器保險絲是幾安的? 手機使用者 點菸器保險片一般都是20a。 學術狗呀 一般是直流12v的。補充 小型車電源一般為直流12v 不同車型可能有所不同 如大型的貨車是直...

新裝機顯示器不亮求助

這裡的電源介面是不是接錯了,錯用了顯示卡的了!另外,你換個pci e插槽再試試! 熊熊熊灬熊孩子 首先插上電源,看看電腦的供電是否正常,即聽風扇響聲和看看開機按鈕是否正常亮,如果正常亮風扇正常運轉說明電腦的供電正常,如果開機按鈕不亮,則要考慮是不是換個電源試試了。電源如果沒問題,然後看看是不是顯示器...