通过前面的学习,在解决问题时根据数据规模开一个很大的数组,并不意味着所有的元素都会被用来存储数据,本小节一起来学习数组元素的操作,包括数组末尾追加元素、插入元素和删除元素。
前面我们使用过数组来存储输入的数据:
#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; }
实际操作时,要尽量避免数组内元素大量的移动,这样会耗费不少时间!