如何使用C++;基于范围的循环在内部工作 我试图理解C++ 11的(类型和x:)(和STL的FoxEYES)如何在内部工作,希望有人能启发我。因此,以下代码: 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++); } 向量v; int z=0; 对于(int i=0;i

如何使用C++;基于范围的循环在内部工作 我试图理解C++ 11的(类型和x:)(和STL的FoxEYES)如何在内部工作,希望有人能启发我。因此,以下代码: 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++); } 向量v; int z=0; 对于(int i=0;i,c++,c++11,C++,C++11,打印0 1 2 3。 我会理解0 0 0 0 0或0 1 2 3 4,但输出,我不太明白如何?for(x:y)编译成什么??我不认为这有多重要,但我使用的是Clang3.4 谢谢 C++11标准实际上给出了等效的传统循环代码,这对于Standardese来说是非常罕见的方法。您可以在第6.5.4节中找到: 在展开中,很明显,循环开始之前的end()值会被保存并稍后检查。不幸的是,该迭代器在第一次调用insert()时无效。关于迭代器无效的规则: 如果没有重新分配,则插入点之前的所有迭代器和引

打印0 1 2 3。 我会理解0 0 0 0 0或0 1 2 3 4,但输出,我不太明白如何?for(x:y)编译成什么??我不认为这有多重要,但我使用的是Clang3.4


谢谢

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

在展开中,很明显,循环开始之前的
end()
值会被保存并稍后检查。不幸的是,该迭代器在第一次调用
insert()
时无效。关于迭代器无效的规则:

如果没有重新分配,则插入点之前的所有迭代器和引用都保持有效

显然
end()
不是“在插入点之前”


由于
insert(p,rv)
的行为是“在
p
之前插入
rv
的副本”,因此插入点明确位于迭代器
p
之前(此处为
v.begin()
)。因此循环迭代器
\u begin
在第一次遍历时也不是“在插入点之前”。

当前代码首先插入数字,然后迭代并插入数字。这是有意的吗?删除行
v.insert(v.begin(),z++),然后重试。顺便说一句,为什么你试图修改一个向量,而在它上面循环?也许你想改用std::list?我相信你看到的是UB。std::vector::insert除了其他状态外,还有:“如果新的size()大于capacity(),那么所有迭代器和引用都将无效。”。行为是未定义的。@wonko:这不是这里真正重要的规则,拥有大容量并不能拯救你。问题是插入点之后的迭代器总是无效的;小说(你错过了最后的大括号)@LightnessRacesinOrbit:它们在另一页上,至少在我的公开草稿中是这样的:(Teehee@LightnessRacesinOrbit:啊,是的,因为“在p之前插入一份rv。”在第一次迭代中总是无效的,保留容量没有什么区别。啊,谢谢你,显然是insert的行为打乱了我的理解,而不是(x:y)是如何实现的。。。