我遇到了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
为了探究发生了什么,我在每个阶段打印了矢量,我得到以下序列:
所以我认为零在第一个周期(其中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()]
,当矢量没有我猜想的元素时,这会产生奇怪的事情。
答案 0 :(得分:4)
是的,您的错误确实在打印代码中。在
vector[vector.size()]
表达式在C ++中是非法的。向量包含范围 [0; vector.size()
)中的元素,表达式尝试访问不存在的元素。向量的一个过去的元素,它是未定义的行为。