NOIP学习小站
西安交通大学附属中学航天学校

数组元素的操作

通过前面的学习,在解决问题时根据数据规模开一个很大的数组,并不意味着所有的元素都会被用来存储数据,本小节一起来学习数组元素的操作,包括数组末尾追加元素、插入元素和删除元素。

前面我们使用过数组来存储输入的数据:

#include<iostream>
using namespace std;
int main()
{
	int a[10];
	for(int i=0;i<10;i++) cin>>a[i];
	return 0; 
}

实际操作中,并非数组的每个元素都全部用来存储数据,一般做法是将要存储的数据按照数组下标从小到大依次存储:

一系列存储操作后,如果还要存储新数据,追加新元素的位置(其实就是下标)就很重要。例如我们通过循环枚举2~1000所有整数,在循环体中筛选出其中的素数存储到数组中,可以使用下面的方法:

#include<iostream>
using namespace std;
int a[1000];
int main()
{
	int cnt = 0;  //cnt变量就是依次存入数组的元素的下标 
	for(int i=2;i<=1000;i++){
		int find = 0;
		for(int j=2;j*j<=i;j++){
			if(i%j==0){
				find = 1;
				break;
			}
		}
		//追加到数组实际存储数据区域的下一个位置 
		if(find==0) a[cnt++] = i; 
	}
	//处理结束后,数组实际使用长度是cnt,从0下标开始存储
	for(int i=0;i<cnt;i++) cout<<a[i]<<" ";
	return 0; 
}

如果要将某个数据\(p\)插入到数组实际存储区a[j]元素之前,保持存储数据相对位置不变:

#include<iostream>
using namespace std;
int a[1000];
int main()
{
	int cnt = 0;  //cnt变量就是依次存入数组的元素的下标 
	for(int i=2;i<=1000;i++){
		int find = 0;
		for(int j=2;j*j<=i;j++){
			if(i%j==0){
				find = 1;
				break;
			}
		}
		//追加到数组实际存储数据区域的下一个位置 
		if(find==0) a[cnt++] = i; 
	}
	
	for(int i=0;i<cnt;i++) cout<<a[i]<<" ";
	cout<<endl;
	
	//将数据p存储到a[j]之前
	int p,j;
	cin>>p>>j;      //输入数据时注意 0 < j < cnt
	//元素后移一位(从最后一个元素开始) 
	for(int i=cnt;i>j;i--) a[i] = a[i-1];
	a[j] = p;
	cnt++;
	
	for(int i=0;i<cnt;i++) cout<<a[i]<<" ";
	cout<<endl;
	return 0; 
}

如果要删除元素a[j],保持存储数据相对位置不变:

#include<iostream>
using namespace std;
int a[1000];
int main()
{
	int cnt = 0;  //cnt变量就是依次存入数组的元素的下标 
	for(int i=2;i<=1000;i++){
		int find = 0;
		for(int j=2;j*j<=i;j++){
			if(i%j==0){
				find = 1;
				break;
			}
		}
		//追加到数组实际存储数据区域的下一个位置 
		if(find==0) a[cnt++] = i; 
	}
	
	for(int i=0;i<cnt;i++) cout<<a[i]<<" ";
	cout<<endl;
	
	//删除a[j] 
	int j;
	cin>>j;     //输入数据时注意 0 < j < cnt
	//元素前移一位(从a[j+1]开始) 
	for(int i=j;i<cnt-1;i++) a[i] = a[i+1];
	cnt--;
	
	for(int i=0;i<cnt;i++) cout<<a[i]<<" ";
	cout<<endl;
	return 0; 
}

实际操作时,要尽量避免数组内元素大量的移动,这样会耗费不少时间!