C++基于范围的循环如何在内部工作

use*_*950 1 c++ c++11

我试图理解C++ 11 for(type&x:)(&stl的for_each)如何在内部工作,并希望有人可以启发我.所以下面的代码:

vector<int> v;
int z=0;
for (int i = 0; i < 5; ++i)
    v.push_back(z++);
for (int& i : v)
{
    printf(" %i", i);
    v.insert(v.begin(), z++);
}
Run Code Online (Sandbox Code Playgroud)

打印0 0 1 2 3.我会理解0 0 0 0 0或0 1 2 3 4,但那个输出,我不太明白怎么样?什么(x:y)编译成?? 不要认为这会很重要,但我使用的是clang 3.4.

谢谢!

Ben*_*igt 6

C++ 11标准实际上给出了等效的传统循环代码,这对于Standardese来说是一种非常罕见的方法.您将在6.5.4节中找到它:

在此输入图像描述

在此输入图像描述

在扩展中,很明显,end()循环开始之前的值将被保存并在以后检查.不幸的是,第一次insert()调用使迭代器无效.迭代器失效的规则:

如果没有重新分配,插入点之前的所有迭代器和引用仍然有效.

显然end()不是"插入点之前".

由于行为insert(p, rv)是"插入rv之前的副本p.",插入点明显位于迭代器之前p(v.begin()在此处).所以循环迭代器__begin也不是第一遍的"插入点之前".

  • 标准渲染的截图; 小说!(你错过了大括号) (3认同)