本文描述了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>
using namespace std;
int main()
{
int a[10]={0,1,2,3,4,5};
int s=3,n=5,x=6;
for (int i=n+1;i>=s;i--)
{
a[i]=a[i-1];
}
a[s]=x;
n+=1;
for (int i=1;i<=n;i++)
{
cout<<a[i]<<" ";
}
return 0;
}
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>
using namespace std;
int main()
{
int a[10]={0,1,2,3,4,5};
int s=3,n=5;
for (int i=s;i<n;i++)
{
a[i]=a[i+1];
}
a[n]=0;
n-=1;
for (int i=1;i<=n;i++)
{
cout<<a[i]<<" ";
}
return 0;
}
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>
using namespace std;
int main()
{
int a[10]={0,1,2,3,4,5};
int s=3,n=5,x=6;
a[s]=x;
for (int i=1;i<=n;i++)
{
cout<<a[i]<<" ";
}
return 0;
}
4. 查
- 即在数列中找到一个数所在的位置。
这里分枚举查找和二分查找(后续分治算法的基础)
枚举查找:
这个很简单,就是一个一个找,这里不说别的,直接贴代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a[10]={0,1,2,3,4,5};
int s=3,n=5,num=3,ans;
for (int i=1;i<=s;i++)
{
if (a[i]==num)
{
ans=i;
}
}
cout<<ans;
return 0;
}
二分查找:
在某些情况下正常查找会 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>
using namespace std;
int main(){
int a[10]={0,2,4,6,8,10,12,14};
int n=7;
int num=10;
int l=1,r=n;
int ans=-1;
while(l<=r)
{
int mid=(l+r)/2;
if(a[mid]==num)
{
ans=mid;
break;
}
if(a[mid]<num)
{
l=mid+1;
}
else
{
r=mid-1;
}
}
cout<<ans;
return 0;
}
好了那么今天的增删改查我就讲完了,本文到这里也结束了,感谢大家的浏览,请点个赞以示支持。
1158



被折叠的 条评论
为什么被折叠?



