有人可以向我解释为什么这个简单的代码:
#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循环如何工作).
一个远程基于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当您使用不再有效的迭代器时,使用会导致未定义的行为.