Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将元素推送到基于范围的for循环中的向量_C++_C++11_Vector - Fatal编程技术网

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 
    } 
}