迭代器失效

djh512 2010-07-19 01:22:08

vector<int> v;
for(int i=0;i<5;++i)
v.push_back(i);
vector<int>::iterator first = v.begin(),last = v.end();
while(first != last )
{
first = v.insert(first,10);
++first;
}

书上说上述代码为一死循环,应改为如下

vector<int> v;
for(int i=0;i<5;++i)
v.push_back(i);
vector<int>::iterator first = v.begin;
while(first != v.end() )
{
first = v.insert(first,10);
++first;
}


我单步跟踪的这两个都是死循环,
第一段代码 first的初始地址 0x00382a28 last 0x00382a3c
每次循环first的地址 0x00382a2c 0x00382a30 0x00382a34 然后0x00382a9c 为什么不按顺序 0x00382a38到0x00382a3c ?
第二段代码为什么也是死循环?
...全文
160 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
GeekWay 2012-07-26
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]

insert并不是替换,而是在first这个迭代器的后面插入一个元素。
即1,2,3,4,5执行insert(10)之后变成1,10,2,3,4,5
此时你first++,first就指向了10
然后再在first后面插入10,vector就变成了
1,10,10,2,3,4,5
以后重复此动作,所以是死循环,因此3L说+2是有道理的,lz对于insert的理解不到位...
[/Quote]

insert(p,t);实在迭代器p的“前面”插入 t 吧!1,2,3,4,5执行insert(vec.begin(),10)之后变成10,1,2,3,4,5,才对。
ypb362148418 2010-07-19
  • 打赏
  • 举报
回复
从中间insert后,end()位置会变化,所以要+2的
djh512 2010-07-19
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 go_michael 的回复:]
这题是应该是 C++ Primer 上的吧

第一个程序在插入数据之后 v.end()没有更新

改了第二个程序之后
first = v.insert(first,10);
++first;
不能保证first的前进,因为insert函数返回的是插入数据的前一个位置,所以应该是first+=2
[/Quote]
了解了
djh512 2010-07-19
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 mymtom 的回复:]
引用 7 楼 djh512 的回复:
+2问题更大啊

+2没有什么问题吧?
[/Quote]
是没有问题 我理解错了
wangxipu 2010-07-19
  • 打赏
  • 举报
回复
每次insert之后,end()难道不需要更新的吗?
还把这个赋值给last
wyz007134 2010-07-19
  • 打赏
  • 举报
回复
insert并不是替换,而是在first这个迭代器的后面插入一个元素。
即1,2,3,4,5执行insert(10)之后变成1,10,2,3,4,5
此时你first++,first就指向了10
然后再在first后面插入10,vector就变成了
1,10,10,2,3,4,5
以后重复此动作,所以是死循环,因此3L说+2是有道理的,lz对于insert的理解不到位...
go_Michael 2010-07-19
  • 打赏
  • 举报
回复
这题是应该是 C++ Primer 上的吧

第一个程序在插入数据之后 v.end()没有更新

改了第二个程序之后
first = v.insert(first,10);
++first;
不能保证first的前进,因为insert函数返回的是插入数据的前一个位置,所以应该是first+=2
mymtom 2010-07-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 djh512 的回复:]
+2问题更大啊
[/Quote]
+2没有什么问题吧?
小楫轻舟 2010-07-19
  • 打赏
  • 举报
回复

#include<vector>
#include<iostream>
using namespace std;
int main()
{
vector<int> v;
for(int i=0;i<5;++i)
v.push_back(i);
vector<int>::iterator first = v.begin(); //begin()
while(first != v.end() )
{
first = v.insert(first, 10); //上面写错了,是10,不是i(测试时用的忘了改过来)
first += 2; // 应该加2,要不然啊没次在新增的元素后面插入
}
//---输出
for(vector<int>::iterator it = v.begin(); it != v.end(); it++)
cout << *it << endl;
return 0;
}
mymtom 2010-07-19
  • 打赏
  • 举报
回复
如果楼主是想在0,1,2,3,4之前都插入一个10的话,可以这样

#include <iostream>
#include <vector>
using namespace std;

int main()
{
int i;
vector<int> v;
vector<int>::iterator it;

for (i = 0; i < 5; i++)
v.push_back(i);
for (it = v.begin(); it != v.end(); ++it)
cout << *it << endl;
for (it = v.begin(); it != v.end(); ++it)
it = v.insert(it, 10), ++it;
for (it = v.begin(); it != v.end(); ++it)
cout << *it << endl;

return 0;
}
小楫轻舟 2010-07-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 djh512 的回复:]

引用 3 楼 lightboat09 的回复:
C/C++ code

#include<vector>
#include<iostream>
using namespace std;
int main()
{
vector<int> v;
for(int i=0;i<5;++i)
v.push_back(i);
vector<int>::iterator first = ……
[/Quote]
+2 不会死循环了啊,
不知道你要是实现什么功能?
algorithms_memo 2010-07-19
  • 打赏
  • 举报
回复
v.insert(first,10);之后最后一个元素已变化,迭代器last需要重新更新。
djh512 2010-07-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lightboat09 的回复:]
C/C++ code

#include<vector>
#include<iostream>
using namespace std;
int main()
{
vector<int> v;
for(int i=0;i<5;++i)
v.push_back(i);
vector<int>::iterator first = v.begi……
[/Quote]
+2问题更大啊
pengzhixi 2010-07-19
  • 打赏
  • 举报
回复
last = v.end();//删除后这个会失效了
djh512 2010-07-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 healer_kx 的回复:]
vector<int>::iterator first = v.begin;

==>
vector<int>::iterator first = v.begin();
[/Quote]
这个是笔误
mymtom 2010-07-19
  • 打赏
  • 举报
回复
不会C++,但是觉得这个循环写得有问题:
1. 循环目的何在。
2. 以及由此引出的问题:循环的结束条件是否一定会满足。
小楫轻舟 2010-07-19
  • 打赏
  • 举报
回复

#include<vector>
#include<iostream>
using namespace std;
int main()
{
vector<int> v;
for(int i=0;i<5;++i)
v.push_back(i);
vector<int>::iterator first = v.begin(); //begin()
while(first != v.end() )
{
first = v.insert(first,i);
first += 2; // 应该加2,要不然啊没次在新增的元素后面插入
}
//
for(first = v.begin(); first != v.end(); first++)
cout << *first << endl;
return 0;
}
饭fan有引力 2010-07-19
  • 打赏
  • 举报
回复
友情帮顶
healer_kx 2010-07-19
  • 打赏
  • 举报
回复
vector<int>::iterator first = v.begin;

==>
vector<int>::iterator first = v.begin();

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧