C++ primer基础之容器insert
C++primer基础之容器insert
今天学习C++基础知识的时候遇到这样问题,始终出现segmentsfault。最后才发现原来是自己对“容器insert之后迭代器会失效”的理解不够透彻。
题目如下:
假定iv是一个int的vector,下面的程序存在什么错误?你将如何修改?
autoiter=iv.begin();
automid=iv.begin()+iv.size()/2;
while(iter!=mid){
if(*iter==some_val)
iv.insert(iter,2*some_val);
}
我起初编写的代码如下:
/*************************************************************************
>FileName:9.22.cpp
>Author:wanchouchou
>Mail:200802376@qq.com
>CreatedTime:2014年11月02日星期日16时34分20秒
************************************************************************/
#include<iostream>
#include<vector>
usingnamespacestd;
intmain(){
vector<int>vint={1,1,1,1,1,3,4,1};
constintval=1;
autoviBegin=vint.begin();
/*这里需要注意,如果vint.size小于等于1的话,viMid=viBegin那么就不会进入while循环,所以我们应当单独考虑这种情况*/
autoviMid=vint.begin()+vint.size()/2;
if(vint.empty()){
cout<<"Thisvectorisempty!"<<endl;
return0;
}
if(vint.size()==1){
if(*viBegin==val){
vint.insert(viBegin,2*val);
}
gotoprint;
}
while(viBegin!=viMid){
if(*viBegin==val){
vint.insert(viBegin,2*val);35}
++viBegin;
}
print:
autoviEnd=vint.end();
viBegin=vint.begin();
while(viBegin!=viEnd){
cout<<*viBegin<<",";
++viBegin;
}
cout<<endl;
}
运行的时候出现segmentationfaulted.
从逻辑上来讲,应该是没问题啊,那为什么又会出错呢?原来我忘记了对容器进行插入操作的重要影响“除了end之外,所有的迭代器都会失效!!!”。当完成第一次插入之后,此时的viBegin和viMid已经失效了,那么之后对其的所有操作都是非法的。所以我们必须在每一次插入操作之后对两个迭代器重新赋值。鉴于对viMid的赋值比较麻烦,所以采用另外的方式记录当前迭代器是否到达容器的中点,代码如下:
/*************************************************************************
>FileName:9.22.cpp
>Author:wanchouchou
>Mail:200802376@qq.com
>CreatedTime:2014年11月02日星期日16时34分20秒
************************************************************************/
#include<iostream>
#include<vector>
usingnamespacestd;
intmain(){
vector<int>vint={1,1,1,1,3,4,1};
constintval=1;
autoviBegin=vint.begin();
/*这里需要注意,如果vint.size小于等于1的话,viMid=viBegin那么就不会进入while循环,所以我们应当单独考虑这种情况*/
automid=vint.size()/2;
if(vint.empty()){
cout<<"Thisvectorisempty!"<<endl;
return0;
}
if(vint.size()==1){
if(*viBegin==val){
vint.insert(viBegin,2*val);
}
gotoprint;
}
while(distance(viBegin,vint.end())>mid){
if(*viBegin==val){
viBegin=vint.insert(viBegin,2*val);
++viBegin;
}
++viBegin;
}
print:
autoviEnd=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,
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!