C++ primer基礎(chǔ)之容器insert
C++ primer基礎(chǔ)之容器insert
今天學(xué)習(xí)C++ 基礎(chǔ)知識的時候遇到這樣問題,始終出現(xiàn)segments fault。最后才發(fā)現(xiàn)原來是自己對“容器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循環(huán),所以我們應(yīng)當(dāng)單獨考慮這種情況*/
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;
}
運行的時候出現(xiàn) segmentation faulted.
從邏輯上來講,應(yīng)該是沒問題啊,那為什么又會出錯呢?原來我忘記了對容器進行插入操作的重要影響“除了end之外,所有的迭代器都會失效!??!”。當(dāng)完成第一次插入之后,此時的viBegin和viMid已經(jīng)失效了,那么之后對其的所有操作都是非法的。所以我們必須在每一次插入操作之后對兩個迭代器重新賦值。鑒于對viMid的賦值比較麻煩,所以采用另外的方式記錄當(dāng)前迭代器是否到達容器的中點,代碼如下:
/*************************************************************************
> 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循環(huán),所以我們應(yīng)當(dāng)單獨考慮這種情況*/
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.22 2, 1, 2, 1, 2, 1, 2, 1, 3, 4, 1,
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
欄 目:C語言
下一篇:C/C++靜態(tài)類和this指針詳解及實例代碼
本文標(biāo)題:C++ primer基礎(chǔ)之容器insert
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/1746.html
您可能感興趣的文章
- 04-02c語言沒有round函數(shù) round c語言
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10使用C++實現(xiàn)全排列算法的方法詳解
- 01-10c++中inline的用法分析
- 01-10用C++實現(xiàn)DBSCAN聚類算法
- 01-10全排列算法的非遞歸實現(xiàn)與遞歸實現(xiàn)的方法(C++)
- 01-10C++大數(shù)模板(推薦)
- 01-10淺談C/C++中的static與extern關(guān)鍵字的使用詳解
- 01-10深入C/C++浮點數(shù)在內(nèi)存中的存儲方式詳解
- 01-10深入理解C/C++混合編程


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機閱讀
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-10delphi制作wav文件的方法
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-11ajax實現(xiàn)頁面的局部加載
- 01-10C#中split用法實例總結(jié)
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 04-02jquery與jsp,用jquery
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文


