C++ primer基礎之容器insert。本站提示廣大學習愛好者:(C++ primer基礎之容器insert)文章只能為提供參考,不一定能成為您想要的結果。以下是C++ primer基礎之容器insert正文
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: [email protected] > 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: [email protected] > 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.22 2, 1, 2, 1, 2, 1, 2, 1, 3, 4, 1,
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
[db:作者簡介][db:原文翻譯及解析]