C++ 将元素推送到基于范围的for循环中的向量
有人能给我解释一下为什么这个简单的代码:C++ 将元素推送到基于范围的for循环中的向量,c++,c++11,vector,C++,C++11,Vector,有人能给我解释一下为什么这个简单的代码: #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;
#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 << ' ';
}
}
虽然我希望:
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
循环期间修改向量是不好的(当我点击此按钮时,我正在尝试其他方法)。在v
声明之后,v.capacity()
返回6
,显然,在v
声明之后添加v.reserve(12)
可以解决问题。在push_-back
操作期间,向量重新分配自身以扩展其容量肯定与此有关
但我想知道这是否只是一种不确定的行为,我只是幸运的是,只有第二个元素是错误的,或者这是否是可以预测和解释的(考虑到for
循环是如何工作的)。A的形式是
{
auto && __range = range_expression ;
for (auto __begin = begin_expr,
__end = end_expr;
__begin != __end; ++__begin) {
range_declaration = *__begin;
loop_statement
}
}
并在循环开始处设置begin
和end
迭代器。当您调用push_back
时,它总是使结束
迭代器无效,如果大小
大于容量
则所有迭代器都无效
因此,使用
push_back
将导致未定义的行为,因为您使用的迭代器不再有效。在第一次push_back
之后,向量将重新分配其缓冲区,并且Range for循环中的迭代器将失效。这是因为for循环使用的迭代器在推过程中可能会失效返回在引擎盖下,向量使用缓冲区,而推回会导致重新分配阵列
更多参考资料如下:
所以输出可能会比原来更混乱,对吗?@jpo38是的。因为它有UB,它可能会导致守护进程飞出计算机。我想说它可能会重新分配缓冲区。@Slava因为OP说容量是6,它保证会重新分配。@NathanOliver yea错过了这个问题,我今天很马虎:(@Slava
for(Slava)give(“Coffe”);
@Slava IMHO向量重新分配其缓冲区或分配新的缓冲区。复数(即缓冲区)我认为这会误导,因为向量只有一个缓冲区。
{
auto && __range = range_expression ;
for (auto __begin = begin_expr,
__end = end_expr;
__begin != __end; ++__begin) {
range_declaration = *__begin;
loop_statement
}
}