我使用了 C++11 标准提供的新的基于范围的 for 循环,我提出了以下问题:假设我们vector<>
使用基于范围的循环for
,我们在向量的末尾添加了一些元素本次迭代。因此,循环何时结束?
例如,请参阅以下代码:
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<unsigned> test({1,2,3});
for(auto &num : test) {
cout << num << " ";
if(num % 2)
test.push_back(num + 10);
}
cout << "\n";
for(auto &num : test)
cout << num << " ";
return 0;
}
我使用“-std=c++11”标志测试了 G++ 4.8 和 Apple LLVM 版本 4.2 (clang++),输出为(两者):
1 2 3
1 2 3 11 13
请注意,第一个循环在原始向量的末尾终止,尽管我们向其中添加了其他元素。似乎 for-range 循环仅在开始时评估容器结束。事实上,这是 range-for 的正确行为吗?是委员会规定的吗?我们可以相信这种行为吗?
请注意,如果我们将第一个循环更改为
for(vector<unsigned>::iterator it = test.begin(); it != test.end(); ++it)
迭代器无效并出现分段错误。