【问题标题】:vector push_back zero into an empty vector向量 push_back 零到一个空向量
【发布时间】:2014-10-28 16:55:35
【问题描述】:

我遇到了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 -- 向量 (0)
  • i=4 -- 向量(5, 0)
  • i=3 -- 向量(5, 4, 0)
  • i=2 -- 向量(5, 4, 3, 0)
  • i=1 -- 向量(5, 4, 3, 2, 0)

所以我认为在第一个周期(应该是 5)中以某种方式将 0 推到了后面,这很奇怪。如果我尝试更大的(比如 n=10),那么每个时间周期都会修改最后一个元素。

我不明白发生了什么。我的猜测是缓冲区中有一些东西可能在 5 点之前被推回,然后这会使推回和周期异相。或者是别的什么?


编辑:


因此,正如人们在 cmets 中友好地指出或暗示的那样,错误出在我使用的打印例程中。记录在案的是:

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()],当我猜向量没有元素时,它会做奇怪的事情。

【问题讨论】:

  • 您也可以给我们看一下打印代码吗? MVCE 将是理想的选择。
  • 这不是您正在运行的代码。见:ideone.com/b1qxSV
  • Works for me 如果我添加代码以在每个阶段打印向量。请添加您用于打印它的代码,以制作完整的测试用例。
  • 我想答案应该告诉你“我哪里出错了?”。发布完整的代码和您的环境。
  • vector[vector.size()] 始终是非法的,并且会导致未定义的行为,因为它会尝试访问向量的过去端元素。

标签: c++ vector stl stdvector


【解决方案1】:

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

vector[vector.size()]

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 2021-06-23
    • 2020-11-20
    • 2021-10-29
    • 2016-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多