我试图了解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。
谢谢!
答案 0 :(得分:6)
C ++ 11标准实际上给出了等效的传统循环代码,这对于Standardese来说是一种非常罕见的方法。您将在6.5.4节中找到它:
在扩展中,很明显,循环开始前的end()
值将被保存并稍后检查。不幸的是,第一个insert()
调用使该迭代器无效。迭代器失效的规则:
如果没有重新分配,插入点之前的所有迭代器和引用仍然有效。
显然end()
不是插入点之前的#34;。
由于insert(p, rv)
的行为是&#34;在rv
。&#34;之前插入p
的副本,插入点明确之前迭代器p
(这里是v.begin()
)。所以循环迭代器__begin
在插入点之前也不是&#34;&#34;在第一关。