真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

C++primer基礎(chǔ)之容器insert

C++ primer基礎(chǔ)之容器insert

安溪網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)公司!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營(yíng)維護(hù)。成都創(chuàng)新互聯(lián)公司成立于2013年到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)公司

 今天學(xué)習(xí)C++ 基礎(chǔ)知識(shí)的時(shí)候遇到這樣問題,始終出現(xiàn)segments fault。最后才發(fā)現(xiàn)原來(lái)是自己對(duì)“容器insert之后迭代器會(huì)失效”的理解不夠透徹。

題目如下:

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

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時(shí)34分20秒
 ************************************************************************/

#include
#include
using namespace std;

int main(){
 vector vint = {1,1,1,1,1,3,4,1};
 const int val = 1;
 auto viBegin = vint.begin();
    /*這里需要注意,如果vint.size小于等于1的話,viMid = viBegin 那么就不會(huì)進(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)行的時(shí)候出現(xiàn) segmentation faulted.

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

/*************************************************************************
 > File Name: 9.22.cpp
 > Author: wanchouchou
 > Mail: 200802376@qq.com
 > Created Time: 2014年11月02日 星期日 16時(shí)34分20秒
 ************************************************************************/

#include
#include
using namespace std;

int main(){
 vector vint = {1,1,1,1,3,4,1};
 const int val = 1;
 auto viBegin = vint.begin();
 /*這里需要注意,如果vint.size小于等于1的話,viMid = viBegin 那么就不會(huì)進(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, 

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


本文名稱:C++primer基礎(chǔ)之容器insert
文章網(wǎng)址:http://weahome.cn/article/pejiog.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部