c 關於迭代器的一些認識

2021-07-31 17:21:09 字數 1150 閱讀 3445

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

view plaincopy to clipboardprint?

iter=vec.insert(iter);

iter=vec.erase(iter);

iter=vec.insert(iter);

iter=vec.erase(iter);

想想究竟為什麼迭代器實效,原因也不難理解。以vector為例,當我們插入乙個元素時它的預分配空間不夠時,它會重新申請一段新空間,將原空間上的元素複製到新的空間上去,然後再把新加入的元素放到新空間的尾部,以滿足vector元素要求連續儲存的目的。而後原空間會被系統撤銷或徵做他用,於是指向原空間的迭代器就成了類似於「懸垂指標」一樣的東西,指向了一片非法區域。如果使用了這樣的迭代器會導致嚴重的執行時錯誤就變得很自然了。這也是許多書上敘述vector在insert操作後「可能導致所有迭代器實效」的原因。但是想到這裡我不禁想到vector的erase操作的敘述是「會導致指向刪除元素和刪除元素之後的迭代器失效」。但是明顯感覺erase帶來失效要比insert來得輕得多。似乎「此失效非彼實效」,想想似乎也是這樣的:erase操作是在原空間上進行的,假設有乙個存有」12345」序列的vector容器原本指向3的迭代器在我刪除2之後無非變成指向4了,我只要注意別用到超過end位置的迭代器不就行了嗎?

說了這麼多似乎可以歸納一下迭代器失效的型別了:

1.由於容器元素整體「遷移」導致存放原容器元素的空間不再有效,從而使得指向原空間的迭代器失效。

2.由於刪除元素使得某些元素次序發生變化使得原本指向某元素的迭代器不再指向希望指向的元素。

對於第一種型別沒什麼好就是的了,原因應該確定如此了。可對於第二種,我寫了如下的**

view plaincopy to clipboardprint?

vector vec;

for(int i=0;i<10;i++)

vec.push_back(i);

vector::iterator iter =vec.begin()+2;

vec.erase(iter);//注:這裡真的不建議這麼寫

cout<<*iter<

關於迭代器一些題

string iterator p 乙個正常的迭代器,可 可解引用 string const iterator cp 可 不可解引用 const string s abcde s物件為乙個const物件,不可修改 1.p s.begin 錯誤,s物件是乙個const修飾的string類物件,所以s....

關於迭代器的一些總結

在進行for迴圈的時候,會碰到兩個名詞 乙個是可迭代的物件iterable,乙個是迭代器iterator。可迭代的物件有很多,例如sequence中的string,list,tuple,還有字典dict,檔案file等,在可迭代的物件中,主要是實現了 iter 方法,從而使可迭代的。迭代器itera...

關於C的一些認識與理解

講講我在這段時間都學到了什麼從前未曾注意的重要的點,更重要的是新學到的知識啦。用space縮排改為用tab鍵縮排 大括號的放置出現了變化,緊跟在 條件 迴圈 語句之後 更緊湊且更短 旁加空格 更加清晰 2.from to for for 3.int a,b a 0 for i 1 i 2 i 條件運...