日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于vector的迭代器失效的问题

發(fā)布時間:2024/2/28 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于vector的迭代器失效的问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

使用vector需謹慎!尤其是還沒有清楚vector的實現原理的時候!

頭文件<vector>中對于失效的檢測方式,定義是這樣的:

當erase了vector中的一個元素后,不能保證原先指向有效位置的iterator仍然有效。
即:
任何insert或push操作都可能導致迭代器失效。當編寫循環(huán)將元素插入到vector或deque容器中時,程序必須確保迭代器在每次循環(huán)后都得到更新。

vector::end返回的迭代器指向窗口最后一個元素的后面一個元素,這是一個理論上的元素,并不指向容器中實際的元素。
所以不能對其進行解引用操作。

我原來的想法(不正確,但也是一種考慮的角度)

首先定義了兩個迭代器:
iter1
iter2
這兩個迭代器同時使用時,刪除vector元素會遇到的坑:

假定讓iter1從頭開始遍歷,用iter2刪除vector中的元素。為了保證不越界每次iter++之前,檢查iter1是否指向end。
但是每一次都報越界的錯誤。為什么呢?
因為用iter2刪除的時候,可能刪除不止一個。刪著刪著,iter1指向的地址被刪除了,iter1變成了野指針。你以為能夠檢查一個野指針是否指向有效地址,而沒有考慮到檢察本身就需要打開iter1,而對iter1解引用,肯定越界。

正確的解釋

眾所周之,當使用一個容器的insert或者erase函數通過迭代器插入或刪除元素"可能"會導致迭代器失效,因此,很多建議都是:讓我們獲取insert或者erase返回的迭代器,以便用重新獲取新的有效的迭代器進行正確的操作。

迭代器失效的原因如下:

當我們插入一個元素時它的預分配空間不夠時,它會重新申請一段新空間,將原空間上的元素 復制到新的空間上去,然后再把新加入的元素放到新空間的尾部,以滿足vector元素要求連續(xù)存儲的目的。而后原空間會被系統(tǒng)撤銷或征做他用,于是指向原 空間的迭代器就成了類似于“懸垂指針”一樣的東西,指向了一片非法區(qū)域。(對這種整體空間轉移的理解,類似于我的另一篇博客C語言 realloc函數 帶著內存游走的函數

如果使用了這樣的迭代器,會導致嚴重的運行時錯誤就變得很自然了。這也是許多書上敘述vector在insert操作后“可能導致所有迭代器實效”的原因。

別人也有過同樣的問題,可以參考理解(見代碼)

問題:
按理說在l_vData.end()前插入元素i后,it++,下次就又可以在l_vData.end()前插入元素了,但是如果用it++,程序運行會出錯。為什么?

#include <vector> #include <iostream>void main(int argc, char** argv) {std::vector<int> l_vData;std::vector<int>::iterator it = l_vData.end();for(int i = 0; i < 10; i++){l_vData.insert(it, i);// it++; // 為什么這樣會運行報錯it = l_vData.end(); // 這樣沒問題std::cout << l_vData[i] << std::endl;}system("pause");return; }

總結

以上是生活随笔為你收集整理的关于vector的迭代器失效的问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。