倒序输出数组与隔位输出
前言
本节课我们将要学习的是数组的相关操作,通过“倒序输出数组和隔位输出数组元素”两个例子,我们可以掌握以下知识点:
数组的概念和特点
数组的声明和定义、索引、数组元素的访问、以及数组的循环遍历
vector
的概念和特点,以及和数组的区别vector
的声明、访问、以及操作方法
数组
在之前的A+B案例中,我们学习了使用int a = 0;
这种形式来表示一个数据,那应该以怎样的形式表示“一组数据”呢?
答案就是数组,C++中的数组是一种用于存储相同数据类型的元素的数据结构。
数据结构的概念理解起来比较抽象,它表示了数据在计算中被组织和存储的形式,而数组呢就是一组按照一定次序排列的数值,数组中的每一个变量被称为元素,比如下图中就是数组的存储形式:
相同数据类型的元素指的是数组中的所有元素都必须是相同的数据类型,也就是说如果创建了一个整型数组,数组里就不能有其他数据类型的存在。
每种数据结构都具有一些特点,我们假设用“班级”这种组织的形式来简单阐述数组的特点:
固定大小:数组一旦声明,其大小通常是固定的,不能在运行时动态更改。就好比开设了一个30人的班级,班级大小已经固定,不能再改变班级的规模。
相同数据类型: 数组中的所有元素必须具有相同的数据类型,假设这个班都是男生或者都是女生,只能有一种性别存在。
连续存储: 数组的元素在内存中是连续存储的,班级里的同学按照顺序就坐,中间没有留空位。
下标访问: 数组中的元素通过下标(索引)进行访问,每个人都有一个学号,学号就是自己的座位,这个学号被称为索引,但是数组里的索引是从0开始的,也就是说,第一个元素的索引是0,第二个元素的索引是1,依次类推
那具体如何在C++中定义和使用数组呢?
C++中声明数组的方式为dataType arrayName[arraySize]
。
dataType
表示数组元素的类型,比如int
、double
、char
等。arrayName
是为数组指定的名称,类似于变量名称。arraySize
是数组的大小,即它可以容纳多少个元素。
// 声明一个包含5个整数的数组
int myArray[5];
C++中使用大括号 {}
初始化数组的元素,也可以逐个赋值。
// 使用大括号初始化一个长度为5的整型数组
int arr[5] = {1, 2, 3, 4, 5};
// 定义一个长度为3的整型数组,并逐个赋值
int arr1[3];
arr1[0] = 10;
arr1[1] = 20;
arr1[2] = 30;
访问数组中的元素,您可以使用下标操作符 []
,请注意,下标从0开始,直到数组长度的前一位。
int value = arr[2]; // 获取数组 arr 的第三个元素的值,即 3
除了访问元素,还可以通过下标操作符 []
修改数组中的元素的值。
arr[0] = 100; // 修改数组 arr 的第一个元素的值为 100
使用循环结构,如 for
循环,可以遍历数组中的所有元素。
for (int i = 0; i < 5; i++) {
cout << arr[i] << " ";
}
⚠️ 需要注意的是,C++中的数组没有提供自动的长度信息,因此在处理数组时必须小心,以避免访问越界的元素。
int a = arr[5]; // 数组长度为5,索引范围为0-4,如果尝试访问arr[5],会越界访问数组范围,导致程序运行出错
以上,我们通过一些简短的代码知道了数组的定义、特点、声明方式、访问方式和遍历方式,以及数组使用中容易出错的地方。
Vector
如果不清楚元素的确切个数,请使用
vector
数组的长度是固定的,但是我们往往并不知道一组数据的大小,这个时候再使用数组就会显得很麻烦,
而vector
(被称为容器),做为C++ 标准库中的一个容器类,表示对象的集合,它可以动态地存储一组元素,所以你可以根据需要轻松地调整 vector
的大小。
和输入输出类似,如果想要使用vector
, 必须包含头文件vector
#include <vector>
using std::vector;
容器的创建方式为vector<类型> 名称
, 无需指明长度
vector<int> myVector; // 创建一个空vector, 元素是int类型的
除此之外,还有一些别的创建方式,常见的有
vector<int> myVector = {1, 2, 3, 4, 5}; // 创建一个包含整数元素的容器并初始化元素
vector<int> myVector(10); // 创建一个包含10个元素的容器,元素为int类型(值被系统默认初始化为0)
vector<int> myVector(10, -1); // 创建一个包含10个重复元素的容器,每个元素的值都是-1
我们已经知道,vector
可以动态调整大小,这种调整是通过vector
内置的方法push_back
动态添加元素来实现的。
push_back()
负责将一个值push
(推送)到vector中的back
(尾端)
vector<int> myVector = {1, 2, 3, 4, 5};
myVector.push_back(6); // 往容器的最末端添加数字6
与数组类似,仍然可以使用下标操作符 []
访问 vector
中的元素
int value = myVector[0]; // 获取第一个元素的值,即 1
还可以使用内置的size()
方法来获取容器当前的元素数量
int size = myVector.size(); // 获取vector的大小
在数组中,我们通过for循环
完成了对数组的遍历,vector
遍历的方式是一样的。
for (int i = 0; i < myVector.size(); i++) {
cout << myVector[i] << " "; // 从索引为0开始,遍历到i等于size的时候退出循环,完成整个遍历
}
此外,vector
还内置了一些别的方法供我们使用:
myVector.pop_back(); // 删除vector末尾的元素
myVector.clear(); // 清空vector中的所有元素
myVector.empty(); // 判断vector是否不含有任何元素,如果长度为0,则返回真,否则,返回假
以上就是关于vector
的一些使用介绍,可能刚开始接触,会觉得对数组和vector的相关操作有点多,看完一遍后只觉得走马观花无法全部记住,但没关系,只需要留个印象,这些内容我们会经常使用,可以在实践中不断增进对这些内容的理解。
倒序输出数组
绕了一大圈子,我们终于回归到题目本身了,题目的第一个要求是实现将输入的整数数组倒序输出,每个数之间用空格分隔。
根据题目要求,我们可以写出基础的代码:
#include <iostream>
using namespace std;
int main() {
int n; // 用来接收数组的长度
cin >> n; // 输入数组长度
}
⚠️ 因为要输入变量,才能确定数组的大小,属于不清楚元素的确切个数,理应使用
vector
,但这里我们为了展示数组操作,暂时这样演示,实际上int arr[n]
这种操作是不被允许的,并且在编译器中可能会报错。
输入n之后,我们可以按照要求定义一个大小为n的整数数组
int arr[n]; // 声明一个大小为 n 的整数数组
对数组进行遍历,输入数组元素
// 输入数组元素
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
倒序输出数组,只需要从数组的最后一位倒着遍历即可
// 倒序输出数组元素,每个数之间用空格分隔
for (int i = n - 1; i >= 0; i--) {
cout << arr[i];
// 每个数之间用空格分隔
if (i > 0) {
cout << " ";
}
}
完整的代码如下:
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n; // 输入数组长度
int arr[n]; // 声明一个大小为 n 的整数数组
// 输入数组元素
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
// 倒序输出数组元素,每个数之间用空格分隔
for (int i = n - 1; i >= 0; i--) {
cout << arr[i];
if (i > 0) {
cout << " ";
}
}
return 0;
}
如果使用vector
呢,又应该怎么写呢?
首先先引入头文件vector
, 并定义一个vector
容器
#include<iostream>
#include<vector>
using namespace std;
int main() {
// 定义一个整型vector
vector<int> nums;
}
接着我们使用while循环代替for循环,控制n及n个数据的输入
int n, num; // n代表vector长度
cin >> n; // 输入n
// 输入n个数字
while(n--) {
cin >> num;
// 使用push_back方法动态添加元素
nums.push_back(num);
}
和数组类似,依旧是从vector
的最后一个元素开始倒序遍历,不过我们可以使用vector.size()
表示vector
的长度
// 倒序输出元素,每个数之间用空格分隔, 使用size()表示vector的大小
for (int i = nums.size() - 1; i >= 0; i--) {
cout << nums[i];
if (i > 0) {
cout << " ";
}
}
完整的代码如下:
#include<iostream>
#include<vector>
using namespace std;
int main() {
// 定义一个整型vector
vector<int> nums;
int n, num;
cin >> n; // 输入数组长度
while(n--) {
cin >> num;
// 使用push_back方法动态添加元素
nums.push_back(num);
}
// 倒序输出元素,每个数之间用空格分隔, 使用size()表示vector的大小
for (int i = nums.size() - 1; i >= 0; i--) {
cout << nums[i];
if (i > 0) {
cout << " ";
}
}
}
隔位输出
题目的第二个要求是每隔一个元素输出其值,中间用空格分隔,只需要对数组从索引为0的位置进行遍历,每次递增2,中间输出空格,这样就能保证输出索引为0、2、4、……
位置的元素,代码如下:
// 每次对i增加2,就能跳过一个数字进行隔位输出
for(int i = 0; i < n; i+=2) {
cout << arr[i];
// 输出空格
if (i < n - 1) {
cout << " ";
}
}
使用vector
并没有改变逻辑,只不过可以用size()
表示vector
的长度,代码如下:
// 隔位输出数组元素,中间用空格分隔,使用size()表示vector的大小
for(int i = 0; i < nums.size(); i += 2) {
cout << nums[i];
// 输出空格
if (i < nums.size() - 1) {
cout << " ";
}
}
完整代码
使用数组的完整代码如下:
#include<iostream>
using namespace std;
int main() {
int n;
cin >> n; // 输入数组长度
int arr[n]; // 声明一个大小为 n 的整数数组
// 输入数组元素
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
// 倒序输出数组元素,每个数之间用空格分隔
for (int i = n - 1; i >= 0; i--) {
cout << arr[i];
if (i > 0) {
cout << " ";
}
}
// 换行输出
cout << endl;
// 隔位输出数组元素,中间用空格分隔
for(int i = 0; i < n; i+=2) {
cout << arr[i];
if (i < n - 1) {
cout << " ";
}
}
}
使用vector
的完整代码如下:
#include<iostream>
#include<vector>
using namespace std;
int main() {
// 定义一个整型vector
vector<int> nums;
int n, num;
cin >> n; // 输入数组长度
// 循环输入数组中的数字
while(n--) {
cin >> num;
// 使用push_back方法动态添加元素
nums.push_back(num);
}
// 倒序输出数组元素,每个数之间用空格分隔, 使用size()表示vector的大小
for (int i = nums.size() - 1; i >= 0; i--) {
cout << nums[i];
if (i > 0) {
cout << " ";
}
}
std::cout << std::endl;
// 隔位输出数组元素,中间用空格分隔,使用size()表示vector的大小
for(int i = 0; i < nums.size(); i += 2) {
cout << nums[i];
if (i < nums.size() - 1) {
cout << " ";
}
}
}
总结
本节课我们学习到了数组和容器的使用,主要的操作包括初始化、索引访问和遍历,这些内容十分的重要,大家一定要练习熟练。