gpt4 book ai didi

c++ - 将元素推送到基于 for 循环的范围内的 vector

转载 作者:太空狗 更新时间:2023-10-29 23:39:27 27 4
gpt4 key购买 nike

有人可以向我解释为什么这个简单的代码:

#include <iostream>
#include <vector>

int main()
{
std::vector<int> v = {0, 1, 2, 3, 4, 5};

for(auto i: v)
{
std::cout << i << ' ';
}

std::cout << std::endl;

for(auto i: v)
{
std::cout << i << ' ';
v.push_back(4);
}

std::cout << std::endl;

for(auto i: v)
{
std::cout << i << ' ';
}
}

此处发布的代码:http://cpp.sh/5kxdu

输出:

0 1 2 3 4 5 
0 0 2 3 4 5
0 1 2 3 4 5 4 4 4 4 4 4

虽然我希望:

0 1 2 3 4 5 
0 1 2 3 4 5
0 1 2 3 4 5 4 4 4 4 4 4

我知道在 for 循环期间修改 vector 是不好的(当我点击它时只是在尝试其他东西)。在 v 声明之后,v.capacity() 返回 6 显然,在之后添加 v.reserve(12) v 被声明修复了这个问题。在 push_back 操作期间,肯定有一些与 vector 重新分配自身以扩展其容量有关的东西。

但我想知道这是否只是一个未确定的行为,我只是很幸运,只有第二个元素是错误的,或者这是否是可预测和可解释的(考虑 for 循环的工作方式)。

最佳答案

A ranged based for loop形式为

{
auto && __range = range_expression ;
for (auto __begin = begin_expr,
__end = end_expr;
__begin != __end; ++__begin) {
range_declaration = *__begin;
loop_statement
}
}

并在循环开始时设置beginend 迭代器。当您调用 push_back 时,它总是使 end 迭代器无效,如果 size 增长大于 capacity 那么所有迭代器都是无效。

因此使用 push_back 将导致未定义的行为,因为您使用的迭代器不再有效。

关于c++ - 将元素推送到基于 for 循环的范围内的 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34933599/

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