2014-10-28 68 views
0

我遇到以下属性std::vector,我不知道,我在想是否有人能为我澄清它。vector push_back zero into empty 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)

因此,我认为在某种程度上一个零被在第一push_backed周期(其中5应该是),这是非常奇怪的。如果我尝试更大一些(比如说n = 10),那么最后一个元素在每个时间周期都会被修改。

我不明白发生了什么事。我的猜测是,缓冲区中有某种东西可能会在5之前推回来,然后这会使推回和周期失调。或者是别的什么?


编辑:


所以人们亲切地注释中的错误是在我使用了打印程序指出-or本条所适用的。备案是:

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()]当向量没有我想的元素。

+3

你能向我们展示打印代码吗? MVCE将是理想的。 – Erbureth 2014-10-28 16:57:45

+0

这不是你正在运行的代码。请参阅:http://ideone.com/b1qxSV – BartoszKP 2014-10-28 16:58:19

+3

[适用于我](http://ideone.com/lcCxgb)如果我添加代码以在每个阶段打印矢量。请添加您用于打印的代码,以制作完整的测试用例。 – 2014-10-28 16:59:45

回答

4

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

vector[vector.size()] 

表达在C++中是非法的。向量包含范围内的元素[0; vector.size(),并且表达式试图访问不存在的。矢量的一个前一个元素,这是未定义的行为。