亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時(shí)間:2017年02月27日 08:41:10   投稿:lqh  
這篇文章主要介紹了C++ primer基礎(chǔ)之容器insert的相關(guān)資料,需要的朋友可以參考下

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

 今天學(xué)習(xí)C++ 基礎(chǔ)知識(shí)的時(shí)候遇到這樣問題,始終出現(xiàn)segments fault。最后才發(fā)現(xiàn)原來是自己對(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<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 那么就不會(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.

從邏輯上來講,應(yīng)該是沒問題啊,那為什么又會(huì)出錯(cuò)呢?原來我忘記了對(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<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 那么就不會(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ì)本站的支持!

相關(guān)文章

  • c++截取漢字和英文混合字符串代碼實(shí)例

    c++截取漢字和英文混合字符串代碼實(shí)例

    這篇文章主要介紹了c++截取漢字英文混合字符串,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • C++?primer超詳細(xì)講解關(guān)聯(lián)容器

    C++?primer超詳細(xì)講解關(guān)聯(lián)容器

    兩個(gè)主要的關(guān)聯(lián)容器為map和set,map中元素是一些關(guān)鍵字—值對(duì),關(guān)鍵字起索引的作用,值則表示與索引相關(guān)聯(lián)的數(shù)據(jù)。set中每個(gè)元素只包含一個(gè)關(guān)鍵字,set支持高效的關(guān)鍵字查詢操作——檢查一個(gè)給定關(guān)鍵字是否在set中
    2022-07-07
  • C++ sleep()和usleep()的區(qū)別

    C++ sleep()和usleep()的區(qū)別

    本文主要介紹了C++ sleep()和usleep()的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • strcat 函數(shù)的使用指南

    strcat 函數(shù)的使用指南

    strcat是連接字符串的函數(shù)。函數(shù)返回指針,兩個(gè)參數(shù)都是指針,第一個(gè)參數(shù)所指向的內(nèi)存的地址必須能容納兩個(gè)字符串連接后的大小。
    2015-09-09
  • 一文帶你搞懂C語言動(dòng)態(tài)內(nèi)存管理

    一文帶你搞懂C語言動(dòng)態(tài)內(nèi)存管理

    動(dòng)態(tài)內(nèi)存是指在堆上分配的內(nèi)存,而靜態(tài)內(nèi)存是指在棧上分配的內(nèi)存。本文將通過幾個(gè)示例帶大家深入了解一下C語言的動(dòng)態(tài)內(nèi)存管理,需要的可以參考一下
    2022-11-11
  • libevent庫的使用--定時(shí)器的使用實(shí)例

    libevent庫的使用--定時(shí)器的使用實(shí)例

    這篇文章主要介紹了libevent庫的使用--定時(shí)器的使用實(shí)例,有需要的朋友可以參考一下
    2013-12-12
  • C語言進(jìn)階教程之循環(huán)語句缺陷詳析

    C語言進(jìn)階教程之循環(huán)語句缺陷詳析

    循環(huán)語句是用于重復(fù)執(zhí)行某條語句(循環(huán)體)的語句,它包含一個(gè)控制表達(dá)式,每循環(huán)執(zhí)行一次都要對(duì)控制表達(dá)式進(jìn)行判斷,如果表達(dá)式為真,則繼續(xù)執(zhí)行循環(huán),這篇文章主要給大家介紹了關(guān)于C語言進(jìn)階教程之循環(huán)語句缺陷的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • 實(shí)例講解C++編程中對(duì)設(shè)計(jì)模式中的原型模式的使用

    實(shí)例講解C++編程中對(duì)設(shè)計(jì)模式中的原型模式的使用

    這篇文章主要介紹了C++編程中對(duì)設(shè)計(jì)模式中的原型模式的使用實(shí)例,包括原型模式中對(duì)C++的深拷貝和淺拷貝的處理,需要的朋友可以參考下
    2016-03-03
  • C語言實(shí)現(xiàn)簡(jiǎn)單彈跳小球

    C語言實(shí)現(xiàn)簡(jiǎn)單彈跳小球

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)簡(jiǎn)單彈跳小球,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Qt xml操作的實(shí)現(xiàn)

    Qt xml操作的實(shí)現(xiàn)

    本文主要介紹Qt xml操作的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2008-08-08

最新評(píng)論