c++入门教程7:增删改查

c++入门教程7:增删改查

本文描述了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。
    那么我们的数组原本是
idx0123456
val01234500

现在,假设我们要在下标为3的位置插入6,那么我们就要吧数组变成这样

idx0123456
val01263450

你会发现我们其实就在把第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. 删

  • 同理删就是指删除数组中任意位置的数
idx0123456
val01234500

s=3s=3s=3
⇓\huge\Downarrow

idx0123456
val01245000

也就是从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。即

idx0123456
val01234500

⇓\huge\Downarrow

idx0123456
val01264500

#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;}

好了那么今天的增删改查我就讲完了,本文到这里也结束了,感谢大家的浏览,请点个赞以示支持。