有关于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才对呀? 展开
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才对呀? 展开
3个回答
展开全部
。。。大多数的的迭代器在做删除、添加的时候,都会失效的。
以vector为例,vector的实现机制是预分配一定大小的内存,一般都是正好与你存的数据一样大容量的内存。从c的角度上来看,vector是一个一直在malloc和free操作的数组。除了查找、比较或者修改指定值等一些不修改vector容量的操作,其他的操作都会造成迭代器失效。
以vector为例,vector的实现机制是预分配一定大小的内存,一般都是正好与你存的数据一样大容量的内存。从c的角度上来看,vector是一个一直在malloc和free操作的数组。除了查找、比较或者修改指定值等一些不修改vector容量的操作,其他的操作都会造成迭代器失效。
更多追问追答
追问
我知道会失效,我自己也尝试过会失效,但是我是想知道为什么会失效?失效的原理是什么?
追答
。。。原理说了呢,
增加、删除内容时,vector容器的大小发生变化,vector内部会重新分配内存。STL这实现vector这个容器的时候就是这么设计的。
展开全部
地址变了 你输出指针的值之前首先判断指针是否不为空
改地址不存在了已经 你得重新给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赋值
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才对啥。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
地址变了
你输出指针的值之前首先判断指针是否不为空
改地址不存在了已经
你得重新给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赋值
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;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询