目录
通过本次练习,将会学习到以下C++知识点:
- 数组的概念和特点
- 数组的声明和定义、索引、数组元素的访问、以及数组的循环遍历
vector
的概念和特点,以及和数组的区别vector
的声明、访问、以及操作方法
一、数组
数组是一种用于存储相同数据类型的元素的数据结构。
数组就是一组按照一定次序排列的数值,数组中的每一个变量被称为元素
相同数据类型的元素指的是数组中的所有元素都必须是相同的数据类型
连续存储: 数组的元素在内存中是连续存储的,中间没有空位。
下标访问: 数组中的元素通过下标(索引)进行访问,但是数组里的索引是从0开始的,也即,第一个元素的索引是0,第二个元素的索引是1,依次类推。
C++中声明数组的方式为dataType arrayName[arraySize]
。
dataType
表示数组元素的类型,比如int
、double
、char
等。arrayName
是为数组指定的名称,类似于变量名称。arraySize
是数组的大小,即它可以容纳多少个元素。
PS:注意末尾的“;”问题,切勿遗忘!
//声明一个包含5个整数的“myArray”名称的数组
int myArray[5];
1.1 初始化数组里的元素(两种方法)
1.使用{}来初始化数组里的元素
int arr[5]={1,2,3,4,5};
2.进行逐一赋值,值得注意的是逐一赋值使用的是索引下标,也即第一个元素从0开始。
//声明一个包含3个整数的“arr”名称的数组,并进行赋值
int arr[3];
arr[0]=66;
arr[1]=88;
arr[2]=99;
//其等同于{},如下示
int arr[3]={66,88,99};
1.2 下标操作符的使用[ ]
//下标操作符的使用[]
1.数组元素的访问
int value = arr[2]; //获取数组arr的第三个元素的值,即99。
2.数组元素的修改
arr[0]=77; //即将原来arr数组的第一个元素66,修改为77。
1.3 使用for循环结构,可遍历整个数组元素
for(int i=0 ; i<6 ; i++){
cout << arr[i] << " " << endl;
};
//特别注意for循环中的初始化变量;条件判断;结果操作,中间使用的为“;”而不是“,”!!!
⚠️ PS:C++中的数组没有提供自动的长度信息,因此在处理数组时必须小心,以避免访问越界的元素。
二、 Vector的概念与基本结构
如果不清楚元素的确切个数,请使用vector(称为容器)
Vector 可以动态地存储一组元素,所以我们可以根据需要轻松地调整 vector
的大小。
与输入输出类似,如果想要使用vector
, 必须包含头文件vector。
#include <vector>
using std::vector;
2.1 容器的创建类型与结构
容器的创建方式为vector<类型> 名称
, 无需指明长度
vector<int>arr; //创建一个名为arr的整数类型的空数组
vector<int> myVector = {1, 2, 3, 4, 5}; // 创建一个包含整数元素的容器并初始化元素
vector<int> myVector(10); // 创建一个包含10个元素的容器,元素为int类型(值被系统默认初始化为0)
vector<int> myVector(10, -1); // 创建一个包含10个重复元素的容器,每个元素的值都是-1
//通过以上示例,可以看出(a,b)中,a表示容器的大小,b表示a中的元素数值,且为重复的a个b值。
//{}中表示初始化元素
2.2 Vector添加元素
vector
可以动态调整大小,这种调整是通过vector
内置的方法push_back
动态添加元素来实现的。
push_back()
负责将一个值push
(推送)到vector中的back
(尾端)
vector<int>arr={1,2,3,4,5};
arr.push_back(6); //往容器arr的尾端添加一个元素
//获取元素,可以使用下标操作符[]
int value=arr[0]; //即获取第一个元素,为1
//使用内置的size()方法来获取容器当前的元素数量
int size=arr.size(); //即获取arr数组的大小
2.3 使用for循环来遍历数组
for(int i=0; i<arr.size() ; i++){
cout << arr.size[i] << " " << endl;
}; //从索引为0开始,遍历到i等于size的时候退出循环,完成整个遍历
2.4 Vector内置的其他使用方法
myVector.pop_back(); // 删除myVector末尾的元素
myVector.clear(); // 清空myVector中的所有元素
myVector.empty(); // 判断myVector是否不含有任何元素,如果长度为0,则返回真,否则,返回假
三、 倒序输出数组
由题目的解释,我们可以看出,建立以下步骤可基本实现
1.首先建立一个空的动态数组,其长度大小不定
2.使用push_back来进行添加,输入的元素
3.最后使用size()来获取数组大小,并从最后的大小下标索引,来依次遍历整个数组,并打印输出,即可实现倒序输出。
vector<int> nums; //设置一个空的数组nums
int n,a; //n代表数组的长度大小;a为后续依次输入的元素
cin >> n; //输入n的大小
//数组nums的创建与添加元素
while(n--){
cin >> a;
nums.push_back(a); //将a,依次循环输入到nums中
}
//数组元素的倒序输出
for(int i=nums.size()-1; i>=0 ; i--){
cout << nums.size[i]; //因为使用索引,所以其大小应该-1;同时注意判断i是否=0的情况
//使用if判断语句,使每个数字输出均有空格
if(i >0){
cin >> " ";
}
}
四、隔位输出
题目的第二个要求是每隔一个元素输出其值,中间用空格分隔,只需要对数组从索引为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 << " ";
}
}
五、题目与解答
题目:
给定一个整数数组,编写一个程序实现以下功能:
1. 将输入的整数数组倒序输出,每个数之间用空格分隔。
2. 从正序数组中,每隔一个单位(即索引为奇数的元素),输出其值,同样用空格分隔。
3.数据范围:1 <= n <= 1000.
题目解读示例:
输入为:
5
2 3 4 5 6
输出为:
6 5 4 3 2
2 4 6
解答:
//使用vector动态数组
#include <iostream>
#include <vector>
using namespace std;
int main(){
//定义一个整型vector数组,名称为:nums
vector<int> nums;
int n,a; //n代表vector数组的长度
cin >> n; //输入数组长度n
//输入n个数字
while(n--){
cin >> a; //输入a
//使用push_back方法动态添加元素到空的nums数组中
nums.push_back(a);
}
//使用size()来表示vector的大小,即nums数组的大小
for(int i=nums.size()-1; i >= 0; i--){
//PS:因为使用下标操作符,所以i应该-1来进行倒序遍历操作
cout << nums[i];
//以下循环使得每个输出数字均有空格
if(i >0){
cout << " ";
}
}
cout << endl; //隔行进行输入第二个要求
//每次对i增加2,即可实现跳过一个数字进行隔位输出的操作
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; //PS:首次创建忘记输入n
int arr[n];
//创建一个数组arr
for(int i=0; i < n; i++){
cin >> arr[i];
}
//倒序输出数组元素,每个数之间用空格分开
//PS:首次创建忘记i应该取等于0!!
for(int i=n-1; i >=0; i--){
cout << arr[i];
if(i>0){
cout << " ";
}
}
cout << endl;
//隔位输出
//PS:首次创建时i<n即可,因为从0开始遍历,
//PS续:设置i<n即满足遍历全部数组的要求了需要所以不需要i<n-1!
for(int i=0; i < n; i+=2){
cout << arr[i];
//PS:该处错误设置为i >0,合理判断后发现应该设置为i<n-1
//i<n,也适合
if(i < n-1){
cout << " ";
}
}
}