有关于C++中迭代器失效的疑问?求高手介绍一下迭代器失效的真谛!!!!

我想问的是迭代器是如何失效的?例如:intmain(){inta[]={1,2,3,4,5};vector<int>ivec(a,a+4);vector<int>::it... 我想问的是迭代器是如何失效的?例如:
int main()
{
int a[]={1,2,3,4,5};
vector<int> ivec(a,a+4);
vector<int>::iterator ix=ivec.begin();
vector<int>::iterator first=ivec.begin();
vector<int>::iterator last=ivec.begin()+2;
cout<<"*last="<<*last<<endl;
ivec.erase(first);
cout<<"*last="<<*last<<endl;
system("pause");
return 0;
}
为什么这个程序到第二次输出*last的时候就会出错了呢?移除了容器的第一个元素,容器后面的元素就应该补上去啥(即应该向前移动)。第一次输出*last的值是3,如果容器元素向前面移动那么第二次就应该输出4,因为迭代器last不是相当于指针么?那么last指向的物理位置应该没有发生变化才对,变化的只是容器元素向前移动了呀,但是这不应该影响last的输出才是呀?
求高手介绍一下迭代器失效的真谛!!!!
last迭代器在删除first之前指向的是元素3所存放的位置,那么在删除first迭代器所指向的元素1后,元素1以后所有的元素只是向前移动一个存储单位,但是last还是应该指向容器的第三个位置呀,那么这时候就应该输出元素4才对啥。因为做了删除操作后容器是减少了元素,应该并不会重新申请一个更大的存储空间啥,也就是说last指向的真是物理地址并没有改变,改变的只是这个地址储存的元素,元素从3变成了元素4才对呀?
展开
 我来答
HarryNR
2014-01-09 · TA获得超过929个赞
知道小有建树答主
回答量:1013
采纳率:33%
帮助的人:795万
展开全部
。。。大多数的的迭代器在做删除、添加的时候,都会失效的。
以vector为例,vector的实现机制是预分配一定大小的内存,一般都是正好与你存的数据一样大容量的内存。从c的角度上来看,vector是一个一直在malloc和free操作的数组。除了查找、比较或者修改指定值等一些不修改vector容量的操作,其他的操作都会造成迭代器失效。
更多追问追答
追问
我知道会失效,我自己也尝试过会失效,但是我是想知道为什么会失效?失效的原理是什么?
追答
。。。原理说了呢,
增加、删除内容时,vector容器的大小发生变化,vector内部会重新分配内存。STL这实现vector这个容器的时候就是这么设计的。
yzzc1989
2014-01-09 · 超过62用户采纳过TA的回答
知道小有建树答主
回答量:169
采纳率:0%
帮助的人:157万
展开全部
地址变了 你输出指针的值之前首先判断指针是否不为空
改地址不存在了已经 你得重新给last赋值
int a[]={1,2,3,4,5}; vector<int> ivec(a,a+4); vector<int>::iterator ix=ivec.begin(); vector<int>::iterator first=ivec.begin(); vector<int>::iterator last=ivec.begin()+2; cout<<"*last="<<*last<<endl; ivec.erase(first); last=ivec.begin()+2;//加上这一句 cout<<"*last="<<*last<<endl;
system("pause");return 0;
追问
last迭代器在删除first之前指向的是元素3所存放的位置,那么在删除first迭代器所指向的元素1后,元素1以后所有的元素只是向前移动一个存储单位,但是last还是应该指向容器的第三个位置呀,那么这时候就应该输出元素4才对啥。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
夷蒙广谨
2019-08-17 · TA获得超过1147个赞
知道小有建树答主
回答量:1759
采纳率:100%
帮助的人:8.3万
展开全部
地址变了
你输出指针的值之前首先判断指针是否不为空
改地址不存在了已经
你得重新给last赋值
int
a[]={1,2,3,4,5};
vector<int>
ivec(a,a+4);
vector<int>::iterator
ix=ivec.begin();
vector<int>::iterator
first=ivec.begin();
vector<int>::iterator
last=ivec.begin()+2;
cout<<"*last="<<*last<<endl;
ivec.erase(first);
last=ivec.begin()+2;//加上这一句
cout<<"*last="<<*last<<endl;
system("pause");return
0;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式