全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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: 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, 

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


# C++  # primer基础之容器insert  # 容器insert  # 容器insert详解及实例代码  # c++ primer中的const限定符  # C++ Primer注解之引用和指针  # 《C++ Primer》隐式类类型转换学习整理  # C++ Primer中&、*符号的多重定义与int *p和int* p的区别讲解  # c++primer:变量和基本类型详解  # 迭代  # 这种情况  # 需要注意  # 都是  # 星期日  # 是一个  # 对其  # 希望能  # 才发现  # 又会  # 你将  # 谢谢大家  # 我们必须  # 应该是  # 忘记了  # gt  # File  # some_val  # wanchouchou  # size 


相关文章: 如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本  专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?  ,购物网站怎么盈利呢?  香港服务器网站推广:SEO优化与外贸独立站搭建策略  Python如何创建带属性的XML节点  深圳网站制作平台,深圳市做网站好的公司有哪些?  建站之星安全性能如何?防护体系能否抵御黑客入侵?  公司门户网站制作流程,华为官网怎么做?  建站之星后台搭建步骤解析:模板选择与产品管理实操指南  微网站制作教程,不会写代码,不会编程,怎么样建自己的网站?  沈阳个人网站制作公司,哪个网站能考到沈阳事业编招聘的信息?  无锡营销型网站制作公司,无锡网选车牌流程?  网站代码制作软件有哪些,如何生成自己网站的代码?  如何快速搭建虚拟主机网站?新手必看指南  名字制作网站免费,所有小说网站的名字?  nginx修改上传文件大小限制的方法  电商平台网站制作流程,电商网站如何制作?  建站之星导航配置指南:自助建站与SEO优化全解析  建站主机服务器选型指南与性能优化方案解析  建站之星如何助力网站排名飙升?揭秘高效技巧  如何选择高性价比服务器搭建个人网站?  制作网站怎么制作,*游戏网站怎么搭建?  Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递  如何在Windows服务器上快速搭建网站?  建站OpenVZ教程与优化策略:配置指南与性能提升  如何做静态网页,sublimetext3.0制作静态网页?  佛山企业网站制作公司有哪些,沟通100网上服务官网?  网站建设制作、微信公众号,公明人民医院怎么在网上预约?  网站海报制作教学视频教程,有什么免费的高清可商用图片网站,用于海报设计?  小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  如何在自有机房高效搭建专业网站?  制作销售网站教学视频,销售网站有哪些?  浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?  建站之星如何快速更换网站模板?  微信小程序 input输入框控件详解及实例(多种示例)  活动邀请函制作网站有哪些,活动邀请函文案?  如何优化Golang Web性能_Golang HTTP服务器性能提升方法  C#如何序列化对象为XML XmlSerializer用法  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  如何通过PHP快速构建高效问答网站功能?  实例解析Array和String方法  简单实现Android验证码  制作表格网站有哪些,线上表格怎么弄?  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  c# 在ASP.NET Core中管理和取消后台任务  建站之星在线版空间:自助建站+智能模板一键生成方案  实现虚拟支付需哪些建站技术支撑?  大型企业网站制作流程,做网站需要注册公司吗?  清除minerd进程的简单方法 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。