文章目录
一、概念
1. 什么是数组?
所谓数组就是一个集合,里面存放了相同类型的数据元素。
特点1: 数组中的每个数据元素的数据类型相同
特点2: 数组是由连续的内存位置组成
2. 一维数组
当数组中只存储一组数据时,称此数组为一维数组。
二、一维数组的定义
1. 语法
(1)数据类型 数组名[数组长度];
(2)数据类型 数组名[数组长度]={值1,值2,…};
(3)数据类型 数组名[ ] = {值1,值2,…};
2. 示例
int num[100]; // 定义了可以存储100个整数类型数组的数组num
float price[5]={3.1,9.6,4.5,4.7,5.9} // 定义了可以存储10个单浮点类型数据的数组price,并同时赋值5个数据
int n[ ]={1,2,3}; // 定义了一个整数类型数组n,此处未人为手动指定数组长度,编辑器将自动根据数据个数自动分配长度
三、数组的访问
1. 通过下标访问
存放在数组中的数据都会各自指定的下标,我们可以通过下标去访问数组中的数组。
但是需要特别注意是,计算机是从0开始数的
,所以我们的下标也是从0开始数的
。那么,也就是我们的第一个数据,下标为0,而最后一个数据的下标是【数组长度-1】
。
示例:
#include<iostream>
using namespace std;
int main(){
int num[3]={1,2,3};
// 获取num数组中的第一个元素
cout << num[0] << endl; // 输出:1
// 获取num数组中的第二个元素
cout << num[1] << endl; // 输出:2
// 获取num数组中的第三个元素
cout << num[2] << endl; // 输出:3
}
2. 利用循环访问
还是以上文中的代码为例,当我们想要将数组int num[3]={1,2,3};
中所有数组都访问输出时,我们可以用笨办法通过下标一个一个的去访问。但这也会有一个问题,如果我的数组中有1000个数据该怎么办?我要依次通过1000个下标去逐个访问输出?那肯定不可能,所以这个为了节省我们的代码量,我们就可以通过循环去访问数组中的数据。
示例:
#include<iostream>
using namespace std;
int main(){
int num[3]={1,2,3};
for(int i=0;i<3;i++){ // 下标从0开始数,直到【数组长度-1】结束
cout << num[i] << endl;
}
// 输出结果:
// 1
// 2
// 3
}
三、修改数组数据
通过下标修改数据。
示例:
#include<iostream>
using namespace std;
int main(){
int num[3]={1,2,3};
// 修改数组中的第一个元素
num[0]=4;
cout << num[0]; // 输出:4
}
四、输入数组数据
1. 通过下标输入单个数据
通过下标,可以指定输入数组某一个位置中的数据,并存储其中
示例:
#include<iostream>
using namespace std;
int main(){
int num[3];
// 往数组的第一个位置输入一个数据
cin >> num[0];
cout << num[0]; // 输出:手动输入的数据结果
}
2. 利用循环输入数据
利用循环结构,可以一次性将数组中空缺的数据全部输入,并存储其中。
示例:
#include<iostream>
using namespace std;
int main(){
int num[3];
// 通过循环,一次性输入
for(int i=0;i<3;i++){ // 下标从0开始,直到【数组长度-1】结束
cin >> num[i];
}
// 通过循环,输出数据
for(int i=0;i<3;i++){
cout << num[i] << endl;
}
}
五、数组的增删
1. 删除数据
在学删除数据之前,我们先想一个问题,数组的元素是否可以删除?这个答案其实是不能的,但是我们可以模拟删除数据。为什么我们不能对数组中的元素进行删除呢?
这里我们来看一下数组比较官方的定义: 数组是用于存储相同类型数据的数据结构,其可以看做是一系列相同数据类型变量按顺序排列的集合。
一系列相同数据类型变量按顺序排列的集合。根据这句话,我们可以很清晰的知道,数组是一个存储了一连串数据的连续空间
,既然是连续的空间,那肯定是不能删除的了!如果我们删除了这个连续空间中的某一个数据,那么这个空间也就断裂了,不再连续了。所以实际上,我们是不能够删除数组中的数据的。
虽然我们不能实现数组数据的删除,但是我们可以模拟删除以达到删除数据的效果。比如:现在,我们先定义一个整数类型的数组`int num[6]={10,25,30,12,80,19},并想要删除数据12。那么我们可以使用覆盖数据的方法,去模拟实现删除数据。具体如下:
(1)覆盖法——前向后
覆盖掉不需要的元素=删除元素,将数组中靠前的数据往后移动覆盖,模拟实现删除元素的效果。
代码实现:
#include<iostream>
using namespace std;
int main(){
int num[6]={10,25,30,12,80,19};
// 从下标3(要删除的数据)开始,下标逐个递减覆盖,直到下标为0(第一个数据)
for(int i=3;i>0;i--){
num[i]=num[i-1]; // 前面的数字覆盖到后面的数字上
}
// 输出覆盖后的数组,从下标1开始,直到下标5结束
for(int i=1;i<6;i++){
cout << num[i] << " ";
}
}
(2)覆盖发——后向前
将数组中靠后的数据往前移动覆盖,模拟实现删除元素的效果。
代码实现:
#include<iostream>
using namespace std;
int main(){
int num[6]={10,25,30,12,80,19};
// 从下标3(要删除的数据)开始,下标逐个递增覆盖,直到下标为5(最后一个数)
for(int i=3;i<6;i++){
num[i]=num[i+1]; // 后面的数字覆盖到前面的数字
}
// 输出覆盖后的数组,从下标0开始,直到下标4结束
for(int i=0;i<5;i++){
cout << num[i] << " ";
}
}
通过两种覆盖方法的对比,可以发现后向前的方法比前向后的方法少一次覆盖,因此我们认为后向前的方法会更好。
(3)数组元素删除特点(后向前)
- 从后往前依次覆盖——重新赋值
- 删除后,数组中实际元素个数没变
- 有效元素个数的变化:n--
2. 插入数据
理解了删除数据的理解,插入数据就比较简单了。
其实插入数据和删除数据一样,我们需要使用覆盖的方式去模拟实现,因为数组是一块连续的空间,所以我们不能随意的分割它。如果想要往一个数组的某个位置插入数据,那我们就只能先依次挪动数组中已有的数据,然后挪出一个空位,再往里插入新数据。这个过程就是覆盖,并且我们需要保证原始的数据不会被覆盖掉,那我们就需要保证原数组还有多余的空白空间,供我们存储一个多的重复数据,这样才能实现插入数据的效果。
(1)数组插入数据特点
- 数组长度 > 当前数据个数+要插入元素个数的总和
- 从最后一个元素依次向后移动,直到移动到待插入的位置。
代码实现:
#include<iostream>
using namespace std;
int main(){
int num[7]={10,25,30,12,80,19};
// 从下标5(最后一个数据)开始,逐个递减覆盖,直到下标为4(要插入的位置)结束
for(int i=5;i>=4;i--){
num[i+1]=num[i];
}
// 插入新值
num[4]=15;
// 输出插入后的新数组
for(int i=0;i<7;i++){
cout << num[i] << " ";
}
}
专栏和博客不断更新中,欢迎关注哦~