简单while循环的问题

时间:2013-12-12 10:14:12

标签: 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) ;
  }
}

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

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

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

The code

The execution

2 个答案:

答案 0 :(得分:7)

因为在循环体的第一行中,他增加i(在第一次迭代时使其成为1),所以他需要减去1以返回有效的数组索引(由此{{ 1}}是数组的第一个索引,0是最后一个索引。

当您更改该程序时程序会崩溃,因为您要访问n-1vec[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++;
}
  • 这就是输出打印1到10的原因。
  • 在向量内,[i-1]表示将i的当前值减去1,然后将该值指定为向量的索引。 (注意:减去的值不会分配回i)
  • 与vec.at(i-1)
  • 相同的描述