【发布时间】: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()]始终是非法的,并且会导致未定义的行为,因为它会尝试访问向量的过去端元素。