时间:2021-05-20
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(); 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(); 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.222, 1, 2, 1, 2, 1, 2, 1, 3, 4, 1,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
c++vector用法C++内置的数组支持容器的机制,但是它不支持容器抽象的语义。要解决此问题我们自己实现这样的类。在标准C++中,用容器向量(vector)实
C++vector中实际删除元素使用的是容器vecrotstd::vector::erase()方法。C++中std::remove()并不删除元素,因为容器的
C++迷宫游戏实现代码题目通过让游戏角色自动寻找迷宫出口,走出迷宫,来练习C++面向对象之封装的基础知识。迷宫图如下所示,其中X表示墙。1、程序分析走出去的原理
之前开发用LinuxC比较多,C++中的STL容器基本没有接触过。最近在学习C++,平时用到c++17中的部分新特性,下面就简单分享下自己C++的学习流程。一、
本文实例讲述了c++中map的基本用法和嵌套用法。分享给大家供大家参考。具体分析如下:C++中map容器提供一个键值对容器,map与multimap差别仅仅在于