我正在阅读简单步骤中的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部分是做什么的?有人能以一种易于理解的方式为我打破这个吗?我将快速重新访问有关矢量数组的部分,看看我是否能够理解。
答案 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;
}
}