简单while循环的问题

Bry*_*rdo 0 c++ loops vector while-loop

我是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) ;
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,这就是我读这篇文章的方式,我确信我读错了,因为结果对我来说没有意义:

当我小于10(向量的大小)时继续执行此代码.所以整数i是0,但它在代码开头增加到1.然而,接下来是我很困惑的部分.

它说vec [i-1],为什么他减去1?然后让它等于我?如果我试图让vec[i] = i;程序崩溃.所以我读它的方式是,vec[i - 0 ]必须为0,因为0在while循环的前一步骤中仅增加到1.然后为了显示结果,他再次将命令调用vec.at()到i-1,这进一步让我感到困惑.我根本不明白向量中-1的含义.括号内的含义是否意味着向量中的位置?

代码

执行

Lig*_*ica 7

因为在循环体的第一行中他增加了i(1在第一次迭代时使它),所以他需要减去1以返回有效的数组索引(这0是数组的第一个索引,并且n-1是最后一个).

当您更改,因为你要访问的程序崩溃vec[1],以vec[N](其中N是向量的大小),而不是vec[0]vec[N-1],向量的实际有效范围.

他正在分配,i以便每个向量元素包含递增计数.这有点令人困惑.

vec[0] = 1
vec[1] = 2
vec[2] = 3
...
vec[9] = 10
Run Code Online (Sandbox Code Playgroud)

它会更好地写成这样:

int i = 0;
while (i < vec.size()) {
   vec[i] = i+1;
   cout << " | " << vec[i];
   i++;
}
Run Code Online (Sandbox Code Playgroud)

要么:

for (int i = 0; i < vec.size(); i++) {
   vec[i] = i+1;
   cout << " | " << vec[i];
}
Run Code Online (Sandbox Code Playgroud)