C++ primer insert疑问

arthurbuffet1111 2009-03-12 02:58:36
C++ primer 4th edition english version 9.3.3节最后 p321, 中文版p276, 英文电子版可以直接下载( http://users.ece.gatech.edu/~hzheng7/C++Primer4E.chm )

原文:
Rather than storing the end iterator, we must recompute it after each insertion:

// safer: recalculate end on each trip whenever the loop adds/erases elements
while (first != v.end()) {
// do some processing
first = v.insert(first, 42); // insert new value
++first; // advance first just past the element we added
}

我感觉怎么这个程序是个死循环的,感觉不会停止啊,比如一开始 v=【7,8,9】,我感觉程序会一直运下去,没次都在7前面插入42. 高人指教。
...全文
115 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Chevin 2009-03-12
  • 打赏
  • 举报
回复
其目的应该是告诉我们,增、删元素之后都不能再信任变量存储的迭代器值,而是应该重新取值。
wuqiangu 2009-03-12
  • 打赏
  • 举报
回复
死循环。。。
如果first进行两次自加,就能确定在每个元素前面插入42。

作者的主要意图是告诉我们,不要把end()存在局部变量里,,,
他老人家打盹啦
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 hmzgz81 的回复:]
确实死循环

C/C++ code
#include <iostream>
#include <vector>

void main()
{
using namespace std;
vector<int> ivec(3);
vector<int>::iterator iter = ivec.begin();
int i = 0;
for (iter = ivec.begin(); iter != ivec.end(); iter++)
{
*iter = i;
i++;
}
iter = ivec.begin();
int j = 0;
while (iter != ivec.end() && j != 10)
{…
[/Quote]
讨论这么多。还不如像8楼那样测一下。
skyygl 2009-03-12
  • 打赏
  • 举报
回复
inser函数返回的是指向要插入元素的位置的迭代器,在lz的例子中第一次first指向7,然后在7前面插入42,++first,使first指向8,然后在8前面插入42,以此类推......,一直到v.end()为止。
hmzgz81 2009-03-12
  • 打赏
  • 举报
回复
确实死循环

#include <iostream>
#include <vector>

void main()
{
using namespace std;
vector<int> ivec(3);
vector<int>::iterator iter = ivec.begin();
int i = 0;
for (iter = ivec.begin(); iter != ivec.end(); iter++)
{
*iter = i;
i++;
}
iter = ivec.begin();
int j = 0;
while (iter != ivec.end() && j != 10)
{
iter = ivec.insert(iter,42); //42一直插在0 前面
++iter;
j++;
}
printf("++++++++++++++++++++++++++++++\n");
for (iter = ivec.begin(); iter != ivec.end(); iter++)
{
printf("%d \n", *iter);
}
return;
}



十个循环之后输出为
42
42
42
42
42
42
42
42
42
42
0
1
2


arthurbuffet1111 2009-03-12
  • 打赏
  • 举报
回复
不要乱回答,++ first还是在7

[Quote=引用 1 楼 fleiss 的回复:]
不是有++first吗?
第一次在7前插入42,第二次在8前插入42,第三次在9前插入42,第四次遇到end,退出
[/Quote]
arthurbuffet1111 2009-03-12
  • 打赏
  • 举报
回复
C++ primer书错误还是不少

[Quote=引用 5 楼 jwpl190 的回复:]
2楼正解。
[/Quote]
jwpl190 2009-03-12
  • 打赏
  • 举报
回复
2楼正解。
taodm 2009-03-12
  • 打赏
  • 举报
回复
死循环还是不死循环,自己为什么不编译试一下。
Qlaiaqu 2009-03-12
  • 打赏
  • 举报
回复
返回的指针指向了42,然后跳到7,在七前插入42,又跳到7,死循环
sagegz 2009-03-12
  • 打赏
  • 举报
回复
的确是死循环,下面代码可以证明.iterator insert(iterator position, elemType value)将value安插于position之前.它返回一个iterator,指向被安插的元素.所以++first后始终是指向7的,iterator不可能到达v.end().

#include <vector>

using namespace std;

int main(){
int a[] = {7,8,9};
vector<int> v(a,a+3);
vector<int>::iterator first = v.begin();
while (first != v.end()){
first = v.insert(first, 42);
++first;
}
return 0;
}
fleiss 2009-03-12
  • 打赏
  • 举报
回复
不是有++first吗?
第一次在7前插入42,第二次在8前插入42,第三次在9前插入42,第四次遇到end,退出

65,210

社区成员

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

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