矢量push_back零成一个空向量

时间:2014-10-28 16:55:36

标签: c++ vector stl stdvector

我遇到了std::vector以下我不知道的属性,我想知道是否有人可以为我澄清。

我认为这段代码:

int main()
{
  int i = 5; 
  vector<int> vector;
  while(i > 0){
    vector.push_back(i);
    --i;
  }
}

应该生成一个包含以下元素的向量:

5, 4, 3, 2, 1

然而,当我运行上面的代码时,我得到的是:

5, 4, 3, 2, 0

为了探究发生了什么,我在每个阶段打印了矢量,我得到以下序列:

  • i = 5 - vector(0)
  • i = 4 - 向量(5,0)
  • i = 3 - 向量(5,4,0)
  • i = 2 - 向量(5,4,3,0)
  • i = 1 - 向量(5,4,3,2,0)

所以我认为零在第一个周期(其中5应该是)得到push_backed这是非常奇怪的。如果我尝试更大(例如n = 10),那么每个周期都会修改最后一个元素。

我不明白他们要去做什么。我的猜测是,缓冲区中有一些东西可能会在5之前被推回,然后这会使推回和循环不同步。或者是别的什么?


编辑:


正如人们在评论中指出 - 或暗示 - 错误是在我使用的打印例程中。记录是:

void print_vector(std::vector<int> vector){
  cout << string(10, '-') << endl;
  cout << "("; 
  for(int i=0; i < vector.size() - 1; ++i){
    cout << vector[i] << ", ";
  }
  cout << vector[vector.size()];
  cout << ")" << endl;

}

错误来自于vector[vector.size()],当矢量没有我猜想的元素时,这会产生奇怪的事情。

1 个答案:

答案 0 :(得分:4)

是的,您的错误确实在打印代码中。在

vector[vector.size()]

表达式在C ++中是非法的。向量包含范围 [0; vector.size()中的元素,表达式尝试访问不存在的元素。向量的一个过去的元素,它是未定义的行为。

相关问题