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

首頁 > 編程 > C++ > 正文

C++ primer基礎之容器insert

2020-01-26 14:14:31
字體:
來源:轉載
供稿:網友

C++ primer基礎之容器insert

 今天學習C++ 基礎知識的時候遇到這樣問題,始終出現segments fault。最后才發現原來是自己對“容器insert之后迭代器會失效”的理解不夠透徹。

題目如下:

假定iv是一個int的vector,下面的程序存在什么錯誤?你將如何修改?

auto iter = iv.begin();auto mid = iv.begin() + iv.size() / 2;while(iter != mid){ if(*iter == some_val)  iv.insert(iter, 2 * some_val);}

我起初編寫的代碼如下:

/************************************************************************* > File Name: 9.22.cpp > Author: wanchouchou > Mail: 200802376@qq.com > Created Time: 2014年11月02日 星期日 16時34分20秒 ************************************************************************/#include<iostream>#include<vector>using namespace std;int main(){ vector<int> vint = {1,1,1,1,1,3,4,1}; const int val = 1; auto viBegin = vint.begin();    /*這里需要注意,如果vint.size小于等于1的話,viMid = viBegin 那么就不會進入while循環,所以我們應當單獨考慮這種情況*/ auto viMid = vint.begin() + vint.size()/2;  if(vint.empty()){  cout << "This vector is empty!" << endl;  return 0; } if(vint.size() == 1){  if(*viBegin == val){   vint.insert(viBegin, 2 * val);  }  goto print; }  while(viBegin != viMid){  if(*viBegin == val){   vint.insert(viBegin, 2 * val);35   }  ++viBegin; } print: auto viEnd = vint.end(); viBegin = vint.begin(); while(viBegin != viEnd){  cout << *viBegin << ", ";  ++viBegin; } cout << endl;}

運行的時候出現 segmentation faulted.

從邏輯上來講,應該是沒問題啊,那為什么又會出錯呢?原來我忘記了對容器進行插入操作的重要影響“除了end之外,所有的迭代器都會失效!!!”。當完成第一次插入之后,此時的viBegin和viMid已經失效了,那么之后對其的所有操作都是非法的。所以我們必須在每一次插入操作之后對兩個迭代器重新賦值。鑒于對viMid的賦值比較麻煩,所以采用另外的方式記錄當前迭代器是否到達容器的中點,代碼如下:

/************************************************************************* > File Name: 9.22.cpp > Author: wanchouchou > Mail: 200802376@qq.com > Created Time: 2014年11月02日 星期日 16時34分20秒 ************************************************************************/#include<iostream>#include<vector>using namespace std;int main(){ vector<int> vint = {1,1,1,1,3,4,1}; const int val = 1; auto viBegin = vint.begin(); /*這里需要注意,如果vint.size小于等于1的話,viMid = viBegin 那么就不會進入while循環,所以我們應當單獨考慮這種情況*/ auto mid = vint.size() / 2; if(vint.empty()){  cout << "This vector is empty!" << endl;  return 0; } if(vint.size() == 1){  if(*viBegin == val){   vint.insert(viBegin, 2 * val);  }  goto print; } while(distance(viBegin, vint.end()) > mid){  if(*viBegin == val){   viBegin = vint.insert(viBegin, 2 * val);   ++viBegin;  }  ++viBegin; }print: auto viEnd = vint.end(); viBegin = vint.begin(); while(viBegin != viEnd){  cout << *viBegin << ", ";  ++viBegin; } cout << endl;}

運行效果如下:

wanchouchou@wanchouchou-virtual-machine:~/c++/9.*$ ./9.222, 1, 2, 1, 2, 1, 2, 1, 3, 4, 1, 

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 离岛区| 桃园县| 东至县| 临清市| 柞水县| 康平县| 泾阳县| 察雅县| 信阳市| 广汉市| 宜兰县| 泽普县| 沐川县| 彰武县| 阿拉善右旗| 汝阳县| 丽江市| 广州市| 嵩明县| 崇左市| 罗源县| 临夏市| 鱼台县| 定兴县| 大方县| 绵竹市| 仁怀市| 正宁县| 赞皇县| 中方县| 全州县| 资中县| 南京市| 临沭县| 石家庄市| 德昌县| 曲周县| 内乡县| 博客| 湘乡市| 新晃|