C++ primer基础之容器insert分享

—-想了解C++ primer基础之容器insert分享的全部内容且更多的C语言教程关注<计算机技术网(www.ctvol.com)!!>

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, 

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/487809.html

(0)
上一篇 2020年11月12日
下一篇 2020年11月12日

精彩推荐