本文描述了c++数组的增删改查。增删改查是数组的基础应用,是新手必不可少的技术。若没学过数组,见《c++入门教程6:一维数组即其应用》。一篇不是那么正经的教程。
1. 增
- 增指的是在数组中任意位置插入一个数
例如若我们想在a[10]={0,1,2,3,4,5}a[10]=\{0,1,2,3,4,5\}a[10]={0,1,2,3,4,5}中第sss个位置插入一个6。
那么我们的数组原本是
| idx | 0 | 1 | 2 | 3 | 4 | 5 | 6 | … |
|---|---|---|---|---|---|---|---|---|
| val | 0 | 1 | 2 | 3 | 4 | 5 | 0 | 0 |
现在,假设我们要在下标为3的位置插入6,那么我们就要吧数组变成这样
| idx | 0 | 1 | 2 | 3 | 4 | 5 | 6 | … |
|---|---|---|---|---|---|---|---|---|
| val | 0 | 1 | 2 | 6 | 3 | 4 | 5 | 0 |
你会发现我们其实就在把第sss到第nnn个位置的元素都往后移一位,再把sss的元素赋值为要替换的数字。
即
#include<bits/stdc++.h>usingnamespacestd;intmain(){inta[10]={0,1,2,3,4,5};ints=3,n=5,x=6;for(inti=n+1;i>=s;i--){a[i]=a[i-1];}a[s]=x;n+=1;for(inti=1;i<=n;i++){cout<<a[i]<<" ";}return0;}2. 删
- 同理删就是指删除数组中任意位置的数
即
| idx | 0 | 1 | 2 | 3 | 4 | 5 | 6 | … |
|---|---|---|---|---|---|---|---|---|
| val | 0 | 1 | 2 | 3 | 4 | 5 | 0 | 0 |
s=3s=3s=3
⇓\huge\Downarrow⇓
| idx | 0 | 1 | 2 | 3 | 4 | 5 | 6 | … |
|---|---|---|---|---|---|---|---|---|
| val | 0 | 1 | 2 | 4 | 5 | 0 | 0 | 0 |
也就是从s+1s+1s+1开始,往前移一位。即
#include<bits/stdc++.h>usingnamespacestd;intmain(){inta[10]={0,1,2,3,4,5};ints=3,n=5;for(inti=s;i<n;i++){a[i]=a[i+1];}a[n]=0;n-=1;for(inti=1;i<=n;i++){cout<<a[i]<<" ";}return0;}3. 改
- 改指的是把任意一个数组中的数替换成另一个数。
例如将下标为sss的数替换为 6
假设s=3s=3s=3。即
| idx | 0 | 1 | 2 | 3 | 4 | 5 | 6 | … |
|---|---|---|---|---|---|---|---|---|
| val | 0 | 1 | 2 | 3 | 4 | 5 | 0 | 0 |
⇓\huge\Downarrow⇓
| idx | 0 | 1 | 2 | 3 | 4 | 5 | 6 | … |
|---|---|---|---|---|---|---|---|---|
| val | 0 | 1 | 2 | 6 | 4 | 5 | 0 | 0 |
即
#include<bits/stdc++.h>usingnamespacestd;intmain(){inta[10]={0,1,2,3,4,5};ints=3,n=5,x=6;a[s]=x;for(inti=1;i<=n;i++){cout<<a[i]<<" ";}return0;}4. 查
- 即在数列中找到一个数所在的位置。
这里分枚举查找和二分查找(后续分治算法的基础)
枚举查找:
这个很简单,就是一个一个找,这里不说别的,直接贴代码:
#include<bits/stdc++.h>usingnamespacestd;intmain(){inta[10]={0,1,2,3,4,5};ints=3,n=5,num=3,ans;for(inti=1;i<=s;i++){if(a[i]==num){ans=i;}}cout<<ans;return0;}二分查找:
在某些情况下正常查找会TLETLETLE(((超时)))。 就比如在1~100里查找 97 ,正常循环枚举要找 97 次才能找到,但如果每次按这个策略
- 试中间值。
- 若找到了,那么恭喜你。
- 若你要找的数比中间值大
那么说明答案在中间值的右边。
于是你现在可以对右侧执行此流程 - 若你要找的数比中间值小
那么说明答案在中间值的左边。
于是你现在可以对左侧执行此流程
那么我们来看看,
第一次找到mid=(1+100)/2=50,97>midmid=(1+100)/2=50, 97>midmid=(1+100)/2=50,97>mid,
第二次mid=(51+100)/2=75,97>midmid=(51+100)/2=75,97>midmid=(51+100)/2=75,97>mid,
第三次mid=(76+100)/2=88,97>midmid=(76+100)/2=88,97>midmid=(76+100)/2=88,97>mid,
第四次mid=(89+100)/2=94,97>midmid=(89+100)/2=94,97>midmid=(89+100)/2=94,97>mid,
第五次mid=(95+100)/2=97,97=midmid=(95+100)/2=97,97=midmid=(95+100)/2=97,97=mid
找到了。只用了5次,相比于97次是不是少了很多。
现在我按照这个原理贴个代码
#include<iostream>usingnamespacestd;intmain(){inta[10]={0,2,4,6,8,10,12,14};intn=7;intnum=10;intl=1,r=n;intans=-1;while(l<=r){intmid=(l+r)/2;if(a[mid]==num){ans=mid;break;}if(a[mid]<num){l=mid+1;}else{r=mid-1;}}cout<<ans;return0;}好了那么今天的增删改查我就讲完了,本文到这里也结束了,感谢大家的浏览,请点个赞以示支持。