C ++ Vector Array / While循环

时间:2014-07-07 00:17:43

标签: c++ arrays vector

我正在阅读简单步骤中的C ++编程,并且已经阅读了我无法理解的内容。我前几天才开始阅读它。

当我完成本书的这一部分时,我特别难以理解矢量数组和元素,尽管花了很多时间尝试理解它,我仍然对此感到不自信,所以我计划重新再次访问。我现在正在本书的后面部分,但这是演示循环,这里是我遇到问题的代码(只需一行):

#include <iostream>
#include <vector>       // Include vector support (Vector function library)
using namespace std;

int main()
{


    //Declaring an integer vector and an integer variable for loop counter
    vector <int> vec ( 10 );
    int i = 0;


    //Now inserting a while loop to assign a counter value to an element of the vector on each iteration
    while ( i < vec.size() )
    {
        i++;                 //Increment the counter
        vec[ i -1 ] = i;     // Assign count to element

        cout << " | " << vec.at ( i -1 );
    }


    return 0;
}

我理解一切,但这一行:

        vec[ i -1 ] = i;     // Assign count to element

我不确定这特别是i -1部分是做什么的?有人能以一种易于理解的方式为我打破这个吗?我将快速重新访问有关矢量数组的部分,看看我是否能够理解。

4 个答案:

答案 0 :(得分:2)

矢量指数从0开始。 10个元素的向量从0索引到9。假设您的目标是使用数字1连续加载数组到10,并且因为您在i处启动0并在索引表达式中使用它之前将其递增,你需要从中减去1才能获得正确的索引。

这段代码也是一样的。

vector<int> vec(10);

int i = 0;
while (i < vec.size())
{
    vec[i] = i + 1;
    i++;
}

i = 0;
while (i < vec.size())
{
    cout << i << ": " << vec.at(i) << endl;
    i++;
}

答案 1 :(得分:1)

如果您将代码分解为while循环实际由单个语句完成的内容,它可能会有所帮助(如果您使用调试器运行while循环并且还添加了诸如i-1之类的监视语句,您会看到类似的内容):

#include <iostream>
#include <vector>       // Include vector support (Vector function library)
using namespace std;

int main()
{


    //Declaring an integer vector and an integer variable for loop counter
    vector <int> vec ( 10 ); // vector of 10 elements: 0...9
    int i = 0; // i starts with the value of 0

    // replace while loop with the individual statements the loop accomplishes
    // note also that vec.size() = 10
    // while (i < vec.size())

    // increment i to 1 (started as 0, from above)
    i++;                 //Increment the counter
    vec[ 0 ] = i;     // i - 1 = 0 here - Assign count to element
    cout << " | " << vec.at ( 0 );
    // increment i to 2
    i++;                 //Increment the counter
    vec[ 1 ] = i;     // i - 1 = 1 here - Assign count to element
    cout << " | " << vec.at ( 1 );

    // continue to i = 9 ...

    // increment i to 10
    i++;                 //Increment the counter
    vec[ 9 ] = i;     // i - 1 = 9 here - Assign count to element
    cout << " | " << vec.at ( 9 );    
    return 0;
}

答案 2 :(得分:1)

您将数字1到1o分配给矢量。

vec[i-1] = i

直接跟在i++之后,这意味着,对于您的第一个索引,您指定的值比索引更多的计数/步数。 简而言之,让我们遵循i的前4个值和插入到向量中的元素:

i = 0;
i = 1;here vec[ 1 - 1] = vec[0] = 1
i = 2;here vec [2 - 1] = vec[1] = 2
i = 3;and finally vec[ 2 ] = 3

答案 3 :(得分:0)

向量是数组的包装类(来源:Link to C++ reference),它们也做了一些非常酷的事情,比如使用模板分配器,提供动态空间,并使用stl迭代器。

因此,使用[]运算符可以像数组一样访问向量。这两个代码片段完全相同:

首先,数组形式:

//Allocate and assign array

int* arr[5]={1,2,3,4,5};

//Print the 3rd element, note that the first index corresponds to 0.

std::cout<< arr[2] <<std::endl;

//Reassign the 2nd element:

arr[1]=54;

现在是矢量版本:

//Allocate and assign vector

std::vector<int> arr( {1,2,3,4,5} );

//Print the 3rd element, note that the first index corresponds to 0.

std::cout<< arr[2] <<std::endl;

//Reassign the 2nd element:

arr[1]=54;

明智的提示:访问这样的向量可能很危险,因为数组的大小可以在代码的其他地方更改。而是考虑以下内容进行分配:

std::vector<int> arr( {1,2,3,4,5} );
int index=0;
for(std::vector<int>::iterator it = arr.begin(); it!= arr.end(); ++it){
    if(index++ == 3){
        (*it) = 54;
    }
}