国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

vector之erase()

2019-11-10 18:07:52
字體:
來源:轉載
供稿:網友

vector之erase()

vector的erase()是需要我們特別注意的。當調用erase()后,刪除元素的指針變成了野指針,這時很容易發生錯誤,比如越界或者獲取的值不是我們要的值。

解決辦法,調整訪問迭代器

從下列代碼及其輸出我們發現,A處發生了訪問錯誤,所訪問的值并不是我們所期望的 值。在對i調整后即 a.begin()+i調整了訪問迭代器,使我們能夠訪問到我們所期望的值。

調用erase(a.begin()+i)后,刪除了第i個元素,i后的元素前移動一位,不過不調整i,正如A 處的代碼,我們將訪問的是原來i+2的元素,而i+1的元素因為erase()移動到了原來i的位 置,這樣就造成,訪問丟失,解決辦法,見代碼B。

圖例 erase()

結論:使用erase()后的循環訪問要謹慎,應正確理解erase()的工作原理。

code:

#include<iostream>#include<vector>using namespace std;vector<int>a;int main(){ for(int i=0;i<10;i++) { a.push_back(i); } int j=0; //調用erase()后a.size()發生了變化 for(int i=0;i<a.size();i++)//+++++++++++++++A { cout<<a.at(i)<<endl; if(i>3) { //刪除的是原來 i i+1 i+2出的元素 a.erase(a.begin()+i); } } cout<<"-------------------------"<<endl; a.clear(); for(int i=0;i<10;i++) { a.push_back(i); } for(int i=0;i<a.size();i++)//++++++++++++++++++B { cout<<a.at(i)<<endl; if(i>3) { a.erase(a.begin()+i); //通過調整i,訪問到了原來所有的元素,盡管a.size()在一直變化。 //刪除的總是同一位置上的元素 i--; } } return 0;} /*output: 0 1 2 3 4 6 8 ------------------------- 0 1 2 3 4 5 6 7 8 9 */參考 vector::erase Iterator validity Iterators, pointers and references pointing to position (or first) and beyond are invalidated, with all iterators, pointers and references to elements before position (or first) are guaranteed to keep referring to the same elements they were referring to before the call.
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 泽州县| 新巴尔虎右旗| 垫江县| 齐齐哈尔市| 张家口市| 库尔勒市| 兴安县| 武冈市| 葵青区| 确山县| 广宁县| 白银市| 德州市| 饶平县| 花垣县| 金沙县| 万州区| 吴川市| 苗栗县| 揭西县| 陕西省| 鸡东县| 渑池县| 拉萨市| 伊川县| 韶关市| 泾川县| 兰州市| 龙门县| 巴彦淖尔市| 中方县| 上杭县| 前郭尔| 堆龙德庆县| 靖远县| 虎林市| 时尚| 武安市| 德安县| 二连浩特市| 沅陵县|