我正在阅读Mike McGrath撰写的一本名为c ++编程的书的“循环时段”。
在书中它解释了while循环如何工作以及它能做什么和不能做什么等。它提供了一个示例代码,我大部分都理解,除了本书没有解释的东西,我想知道是否有任何你可以解释一下。
这是代码:
#include <iostream>
#include <vector>
using namespace std ;
int main(){
vector <int> vec(10) ;
int i = 0 ;
while (i < vec.size()){
i ++ ;
vec[i-1] = i ;
cout << " | " << vec.at(i-1) ;
}
}
现在,这就是我读这篇文章的方式,我确信我读错了,因为结果对我没有意义:
当我小于10(向量的大小)时,继续执行此代码。所以整数i是0,但它在代码开头增加到1。然而,接下来是我很困惑的部分。
它说vec [i-1],为什么他减去1?然后让它等于我?如果我试图让它vec[i] = i;
程序崩溃。所以我读它的方式是,vec[i - 0 ]
必须为0,因为0在while循环的前一步骤中仅增加到1。然后为了显示结果,他再次将命令vec.at()
调用到i-1,这进一步让我感到困惑。我根本不明白向量中-1的含义。括号内的含义是否意味着向量中的位置?
答案 0 :(得分:7)
因为在循环体的第一行中,他增加i
(在第一次迭代时使其成为1
),所以他需要减去1以返回有效的数组索引(由此{{ 1}}是数组的第一个索引,0
是最后一个索引。
当您更改该程序时程序会崩溃,因为您要访问n-1
到vec[1]
(其中vec[N]
是矢量大小),而不是N
到{{ 1}},向量的实际有效范围。
他正在分配vec[0]
,以便每个向量元素包含递增计数。这有点令人困惑。
vec[N-1]
最好这样写:
i
或:
vec[0] = 1
vec[1] = 2
vec[2] = 3
...
vec[9] = 10
答案 1 :(得分:1)
正如Lightness所指出的,他需要减去1来回到基于0的索引。循环与下面相同。
vector<int> vec(10);
int i = 0;
while(i < vec.size())
{
vec[i] = i + 1;
cout << " |" << vec.at(i);
i++;
}