一维数组
本文章隶属于 \(zhzzhzzzz\) 的 一个珂学的世界,笔者为 \(ahawzlc\) 。
最后更新于:2020.8.23.
一维数组
引子
例 1
输入一个长度为 \(n\) 的序列并倒序输出。
利用前文所述知识,可以尝试用 \(n\) 个变量来存储序列。但是——
如果 \(n \le 10\) 还好,\(n \le 1000\) 呢,\(n \le 1000000\) 呢?估计写完之后人都没了。
所以我们需要一段连续的区间来存储这个序列,而且能够直接修改或查询某个位置的值。
神说:“要有光!”于是就有了光。C++
的创始人说:“要有数组!”于是就有了数组。
数组的建立与使用
建立
在C++
中,我们使用数据类型 数组名[数组范围]
来建立一个数组。
比如上述 例 1 要求建立的数组,假设数据类型为整型,可以这样来建立:
int a[10000001];
方括号里的数字我们也称为“下标范围”。
等等,为什么数组范围是 \(1000001\) 而不是 \(1000000\) ?
这是因为,在c++
中的数组,a[n]
下标范围是 a[0]
~ a[n-1]
,所以为了存储 \(1\) ~ \(n\) 的数据,数组范围通常开大一点。
引用和修改
数组作为基础数据结构之一,具有可以直接引用和修改的特点。
我们可以直接把 a[i]
理解为 \(a\) 数组第 \(i\) 个位置上的变量。
也就是说,数组某个位置上的数据可以使用一般变量的修改方法来修改。
比如,a[i]=a[i-1];
表示将a[i-1]
的值赋给a[i]
;a[i]=a[i]+1
或a[i]++;
表示将a[i]
的值加 1 。
memset
在很多题目中,我们可能需要将全部数组赋一个较大或较小的值。
这时候我们可以使用 memset
函数,它存在于 cstring
头文件中。
函数的使用格式:memset(a,0,sizeof(a))
或 memset(a,0,sizeof a)
,其中 a
是数组名,0
为数值,通常使用 16 进制的数据,如常见的值有 \(0x3f\),\(0x7f\) \(-1\) 等。
解决例 1
标准代码如下:
#include<iostream>
#include<cstdio>
using namespace std;
int a[1000001];
int main() {
int n;
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=n;i>=1;i--) cout<<a[i]<<' ';
return 0;
}
练习题
例 2 P1047 校门外的树
一遍双重循环,一遍单重循环:
- 输入数据,并将所有给定区间内打上标记,表示被挖走了。
- 统计没有标记(没有被挖走)的位置的数量。
或者三遍循环,即把上述的双重循环拆开。
标程
#include<iostream>
using namespace std;
bool vis[10005];
int main() {
int n,m,ans=0;
cin>>n>>m;
for(int i=1;i<=m;i++) {
int l,r;
cin>>l>>r;
for(int i=l;i<=r;i++) vis[i]=1;
}
for(int i=0;i<=n;i++) if(!vis[i]) ans++;
cout<<ans;
return 0;
}
结语
这就是一维数组了,常见的题型就是对一维数组的值进行操作并统计答案。
如有不足之处,请发送邮件至我的邮箱,邮箱见“我的博客——关于我”。
好的,这篇文章到此结束,我们下次再见。