gpt4 book ai didi

c++ - 在基于范围的循环期间将元素添加到 vector c++11

转载 作者:可可西里 更新时间:2023-11-01 15:07:53 25 4
gpt4 key购买 nike

我使用了 C++11 标准提供的新的基于范围的 for 循环,我想到了以下问题:假设我们迭代 vector<>使用基于范围的 for ,并且在这次迭代中我们在 vector 的末尾添加了一些元素。那么,循环什么时候结束?

例如,看这段代码:

#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

请注意,尽管我们向其中添加了其他元素,但第一个循环在原始 vector 的末尾终止。似乎 for-range 循环只在开始时评估容器结束。这实际上是 range-for 的正确行为吗?是组委会指定的吗?我们可以信任这种行为吗?

请注意,如果我们将第一个循环更改为

for(vector<unsigned>::iterator it = test.begin(); it != test.end(); ++it)

迭代器无效并出现段错误。

最佳答案

不,你不能依赖这种行为。在循环内修改 vector 会导致未定义的行为,因为在修改 vector 时循环使用的迭代器将失效。

基于for循环的范围

for ( range_declaration : range_expression) loop_statement

本质上等同于

{
auto && __range = range_expression ;
for (auto __begin = std::begin(__range),
__end = std::end(__range);
__begin != __end; ++__begin) {
range_declaration = *__begin;
loop_statement
}
}

当您修改 vector 时,迭代器 __begin__end 不再有效,取消引用 __begin 会导致未定义的行为。

关于c++ - 在基于范围的循环期间将元素添加到 vector c++11,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17076672/

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