C++零基础入门——11一维数组


一、概念

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] << " ";
	}
}

专栏和博客不断更新中,欢迎关注哦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小汪不秃头~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值