C++ primer基礎(chǔ)之容器insert
安溪網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)公司!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項目制作,到程序開發(fā),運(yùn)營維護(hù)。成都創(chuàng)新互聯(lián)公司成立于2013年到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運(yùn)維經(jīng)驗,來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)公司。
今天學(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 那么就不會進(jìn)入while循環(huán),所以我們應(yīng)當(dāng)單獨(dú)考慮這種情況*/ 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; }
運(yùn)行的時候出現(xiàn) segmentation faulted.
從邏輯上來講,應(yīng)該是沒問題啊,那為什么又會出錯呢?原來我忘記了對容器進(jìn)行插入操作的重要影響“除了end之外,所有的迭代器都會失效!!!”。當(dāng)完成第一次插入之后,此時的viBegin和viMid已經(jīng)失效了,那么之后對其的所有操作都是非法的。所以我們必須在每一次插入操作之后對兩個迭代器重新賦值。鑒于對viMid的賦值比較麻煩,所以采用另外的方式記錄當(dāng)前迭代器是否到達(dá)容器的中點(diǎn),代碼如下:
/************************************************************************* > 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 那么就不會進(jìn)入while循環(huán),所以我們應(yīng)當(dāng)單獨(dú)考慮這種情況*/ 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; }
運(yùn)行效果如下:
wanchouchou@wanchouchou-virtual-machine:~/c++/9.*$ ./9.22 2, 1, 2, 1, 2, 1, 2, 1, 3, 4, 1,
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
標(biāo)題名稱:C++primer基礎(chǔ)之容器insert
鏈接URL:http://www.chinadenli.net/article6/pejiog.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、服務(wù)器托管、App開發(fā)、用戶體驗、網(wǎng)頁設(shè)計公司、微信公眾號
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)