C++ primer上的一道题,奇数就插入(未规定前后),偶数就erase。问标题中的语句是否合法。自己觉得是不合法的。但是Dev上可以正常运行,出现结果却很诧异。知道正确的写法,但是很好奇为什么会出现“1 1 1 3 3 3……”的输出。注释是自己试了几次后的分析,但是不正确。想请教编译器在这个语句过程中到底做了什么。求大神指教!!万分感谢!
list vi = {0,1,2,3,4,5,6,7,8,9};
auto iter = vi.begin();
while (iter != vi.end()) {
if (*iter % 2) {
iter = vi.insert(iter, *iter++); //temp = *iter; iter++; iter = vi.insert(iter, temp);
++iter;
++iter;
} else
iter = vi.erase(iter);
}
是这样的:
if (*iter % 2) {
iter = vi.insert(iter, *iter++); //temp = *iter; iter++; iter = vi.insert(iter, temp);
++iter;
++iter;
}
这段代码作用是如果list里当前的迭代器指向奇数的话,先把该奇数取出(*(iter++)),插入到当前位置,迭代器后移一位,此时指向老的奇数,下面再两次++,指向偶数后面的第一个奇数,最后就是你看到的结果了。
应该使用插入迭代器。这样可以确保迭代的过程中插入元素的正确
http://blog.csdn.net/huang_xw/article/details/8205058
http://blog.csdn.net/bonchoix/article/details/8062483
设置断点,单步调试一下,一步步跟踪,就看到具体运行情况了
以下是vi运行时数据变化:
1、123456789(去除0,最后iter指向1)
2、1123456789(*iter++等价于*iter;iter++。所以先插入1,后iter指向第二个1,最后iter被赋值指向第一个1.后面两个++,iter就指向2.估计你这里弄不明白)
3、113456789(删除2,注意删除后节点指向前一个节点,所以iter指向第二个1)
4、1113456789(插入1,最后iter指向3);
后面不用我说了吧,自己推导了事。