91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++ primer基礎之容器insert

發布時間:2020-10-02 23:41:44 來源:腳本之家 閱讀:138 作者:lqh 欄目:編程語言

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.22
2, 1, 2, 1, 2, 1, 2, 1, 3, 4, 1, 

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

会宁县| 雷山县| 明水县| 托克托县| 仪陇县| 德清县| 广州市| 广水市| 鹰潭市| 深泽县| 香港| 土默特左旗| 清徐县| 三原县| 吉安县| 个旧市| 宁津县| 湟源县| 瑞昌市| 万山特区| 九台市| 威信县| 阿拉尔市| 常熟市| 潜山县| 泰州市| 宿州市| 沂南县| 汝州市| 舒城县| 大石桥市| 安新县| 唐海县| 工布江达县| 铁力市| 浦东新区| 鸡东县| 桐梓县| 蒙阴县| 木里| 濮阳县|