关于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++,程序運行會出錯。為什么?
總結
以上是生活随笔為你收集整理的关于vector的迭代器失效的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PAT1004 成绩排名【vector
- 下一篇: PAT1005 继续(3n+1)猜想 (