我刚才有一个关于C ++的快速问题。如果其他人已经问过这个问题,请告诉我,我会将其删除为副本。
我的问题基本上是,如果你在迭代时改变向量,那么每个循环的行为是什么。例如:
int main() {
// your code goes here
std::vector<char> v;
for(char i = 'a'; i <= 'f'; i++) {
v.push_back(i);
}
// v is {a, b, c, d, e, f}
char c = 'A';
for(const auto &elem : v) {
cout << elem << ", ";
v.push_back(c++); // appending 'A', 'B', 'C', ...
}
cout << endl;
// outputs: "a, b, c, , , ," (note there isn't a ... here, the loop stops).
// Just printing normally now
cout << "--------" << endl;
for(const auto &elem : v) {
cout << elem << ", ";
}
cout << endl;
// outputs: a, b, c, d, e, f, A, B, C, D, E, F,
return 0;
}
有人可以解释这种行为吗?我知道上面的每一个都等同于下面的代码,但似乎并没有让事情变得更清楚。
for (auto __begin = v.begin(), __end = v.end();
__begin != __end; ++__begin) {
auto elem = *__begin;
cout << elem << ", ";
v.push_back(c++); // appending 'A', 'B', 'C', ...
}
cout << endl;
此问题似乎是由向量调整大小导致迭代器无效的。在创建向量后调用v.reserve(20)
修复了此问题,并在二楼循环中输出:a, b, c, d, e, f,
。
答案 0 :(得分:3)
std :: vector :: push_back状态的文档
如果new size()大于capacity(),则所有迭代器和引用(包括last-the-end迭代器)都将失效。否则只有过去的结束迭代器无效。
当for循环递增时,它将新的迭代器位置与v.end()进行比较,并可能进入UB,可能是某些段错误或异常。