将元素推送到基于范围的for循环内的向量

jpo*_*o38 2 c++ vector c++11

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

#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 << ' ';
    }
}
Run Code Online (Sandbox Code Playgroud)

代码发布在这里: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 
Run Code Online (Sandbox Code Playgroud)

虽然我期望:

0 1 2 3 4 5 
0 1 2 3 4 5 
0 1 2 3 4 5 4 4 4 4 4 4 
Run Code Online (Sandbox Code Playgroud)

我知道在for循环期间修改向量是不好的(当我点击它时只是尝试其他东西).经过v申报,v.capacity()回报6显然,加入v.reserve(12)后v宣告修复该问题.肯定有一些与矢量重新分配有关的东西,以扩大其在push_back操作期间的容量.

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

Nat*_*ica 7

一个远程基于for循环具有的形式

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

并在循环开始时设置begin和end迭代器.当你调用push_back它时,它总是使end迭代器失效,如果size变大,capacity那么所有的迭代器都会失效.

因此,push_back当您使用不再有效的迭代器时,使用会导致未定义的行为.

  • @NathanOlivier:我很幸运,谢谢! (2认同)