gpt4 book ai didi

C++ for each loop with mutating vector

转载 作者:行者123 更新时间:2023-11-27 23:59:30 25 4
gpt4 key购买 nike

我刚刚有一个关于 C++ 的快速问题。如果其他人已经问过这个问题,请告诉我,我会将其删除。

我的问题本质上是,如果您在迭代时更改 vector ,for each 循环的行为是什么。例如:

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 each 等同于下面的代码,但这似乎并没有让事情变得更清楚。

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;

更新:

这个问题似乎是由使迭代器无效的 vector 大小调整引起的。创建 vector 后调用 v.reserve(20) 修复此问题并在二楼循环中输出:a, b, c, d, e, f,

最佳答案

std::vector::push_back 状态的文档

如果新的 size() 大于 capacity() 则所有迭代器和引用(包括尾后迭代器)都将失效。否则只有尾后迭代器无效。

当 for 循环递增时,它会将新的迭代器位置与 v.end() 进行比较,并可能进入 UB,可能是一些段错误或异常。

关于C++ for each loop with mutating vector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40250680/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com