返回信息流#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> vi(2,2);
for(int i=0;i<10;i++)
vi.push_back(i);
auto it=vi.begin();
while(it!=vi.end())
if(*it%2)
it=vi.insert(it,*it);
else
it++;
return 0;
}
正常来说应该是在1前面一直插入1啊,为什么只插入了1个之后就插入-17891602(0xfeeefeee)
麻烦大神帮忙看下
这是一条镜像帖。来源:北邮人论坛 / cpp / #77053同步于 2014/2/19
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
【菜鸟求问个关于迭代器的问题】
mystep
2014/2/19镜像同步18 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
首先请注意insert的第二个参数其实是个reference, 当vector发生reallocation的时候, 它就失效了。
然后请允许我对您这种看上去少了两行, 实际上很差的代码风格吐槽一下。
第一次insert后的返回值赋给了it,那it不应该是reallocation之后的新的迭代器么?我是刚学这个的菜鸟,问题比较弱,见谅。。。
ps:吐槽才是进步的源泉,欢迎吐槽,嘿嘿,谢谢!对了,是说少了主函数的参数么。。
【 在 gsl2011 的大作中提到: 】
: 首先请注意insert的第二个参数其实是个reference, 当vector发生reallocation的时候, 它就失效了。
: 然后请允许我对您这种看上去少了两行, 实际上很差的代码风格吐槽一下。
米有一直加1,就加了一次,然后就加了那个诡异的数。。是说insert后就失效了么,但是返回值又赋给了it了,it不应该重新有效么。。
【 在 binux 的大作中提到: 】
: 它就是一直往前加1啊
我在g++下测试是无限循环的,就像你说的一直插入1。
不过vector理论上“如果超过其容量,它的所有iterators、pointers、references都会失效;执行安插和移除操作时,也会令一部分iterators、pointers、references失效”。(出自《C++标准程序库》)
所以我猜你这个做法不是保证安全的,而是编译器自身决定的。
还有问个事情 auto是迭代器的什么表现形式?百度了下没搜到什么有用信息。。。
我用的vs2010,原来是和编译器有关哈。。
我这没有一直是1,只插入了一次之后就插入一个怪数。。之后就是偶尔1,偶尔怪数。。
感觉怪数就是迭代器失效导致的,但是it最后已经接受了insert的返回值,感觉失效后应该重新有效了,值被更新了啊。。不懂。。
那个怕我解释不好,看了下书,抄给你,:用auto就能让编译器替我们去分析表达式所属的类型。和原来那些只对应一种特定类型的说明符(比如double)不同,auto让编译器通过初始值来推算变量的类型。显然auto定义的变量必须有初始值。。。
【 在 anshanhs 的大作中提到: 】
: 我在g++下测试是无限循环的,就像你说的一直插入1。
: 不过vector理论上“如果超过其容量,它的所有iterators、pointers、references都会失效;执行安插和移除操作时,也会令一部分iterators、pointers、references失效”。(出自《C++标准程序库》)
: 所以我猜你这个做法不是保证安全的,而是编译器自身决定的。
: ...................