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

时间:2014-03-31 22:39:23

标签: c++ c++11

我试图了解C ++ 11的类型(& 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++);
}

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

谢谢!

1 个答案:

答案 0 :(得分:6)

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

enter image description here

enter image description here

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

  

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

显然end()不是插入点之前的#34;。

由于insert(p, rv)的行为是&#34;在rv。&#34;之前插入p的副本,插入点明确之前迭代器p(这里是v.begin())。所以循环迭代器__begin在插入点之前也不是&#34;&#34;在第一关。