第四章 数组
一维数组
数组的定义
- 数组的定义方式和变量类似。
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int a[10], b[20]; //a数组相当于是由20个在地址上连续的int型变量组成的整体
float f[33]; //f数组和c数组是一样的逻辑
char c[21];
return 0;
}
- 数组的初始化
在main函数内部,未初始化的数组中的元素是随机的。
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int a[3] = { 0,1,2 }; //含有三个数组元素分别是0,1,2
int b[] = { 0,1,1}; //等价于上面的初始化方式,维度是三
int c[5] = { 0,1,2 }; //等价于初始化c[]={0,1,2,0,0}
char d[3] = { 'a' ,'b','v' }; //字符数组的初始化
return 0;
}
- 访问数组元素
通过下标访问数组。
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int a[3] = { 0,1,2 }; //数组的下标是从0开始,a[0] a[1] a[2]
cout << a[0] << " " << a[1] << ' ' << a[2] << endl;
a[0] = 5;
cout << a[10] << endl; //越界了?数组没有第十一个元素啊,是的,没有第十一个元素
//但是数组是一个连续地址存放的一连串的相应类型的变量,
// a:数组名就是一个代表这个数组起始位置的指针,找数组元素会按照数组名所在的地址往后加n个单位变量的地址,比如a[10],a+10*sizeof(int),这个地址存在,有元素
//但是不能确定存的是什么,而且,如果数据元素被越界更改,可能会出现问题,要注意数组的边界
int f[100] = {0}; //对f的所有元素初始化为0
return 0;
}
- 练习题1: 使用数组实现求斐波那契数列的第N项。
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n;
int f[100] = {0};
cout << "请输入你要求斐波那契数列哪一项:" ;
cin >> n;
f[0] = 1; f[1] = 1;
for(int i = 2; i < n; i++)
{
f[i] = f[i - 1] + f[i - 2];
}
cout << "你要求斐波那契数列是:" <<f[n-1]<< endl;
return 0;
}
- 练习题2:输入一个n,再输入n个整数。将这n个整数逆序输出。
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n;
cout << "输入要存储的整数数目:";
cin >> n;
int a[100];
for (int i = 0; i < n; i++)
cin >> a[i];
cout << "逆序输出:\n";
for (int i = 0; i < n; i++)
cout << a[n-1-i] << " ";
return 0;
}
- 练习题3:输入一个n,再输入n个整数。将这个数组顺时针旋转k(k <= n)次,最后将结果输出。
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n,k;
int a[100];
cout << "输入要存储的整数数目和顺时针旋转的次数:";
cin >> n >> k;
for (int i = 0; i < n; i++)
cin >> a[i];
reverse(a, a + k);
reverse(a + k, a + n);
reverse(a, a + n);
for (int i = 0; i < n; i++)
cout << a[i] << " ";
return 0;
}
- reverse:reverse(a+m, a + k):将a[m]到a[n-1]的元素反转。结合这个思考是怎么做到顺时针旋转的,思考如何做逆时针旋转:
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n,k;
int a[100];
cout << "输入要存储的整数数目和顺时针旋转的次数:";
cin >> n >> k;
for (int i = 0; i < n; i++)
cin >> a[i];
reverse(a +(n-k), a + n);
reverse(a, a + (n-k));
reverse(a, a + n);
for (int i = 0; i < n; i++)
cout << a[i] << " ";
return 0;
}
- reserve:
reserve 函数用于预留容器中的元素数量,但并不改变容器中的元素数量。也就是说,调用 reserve 后,容器的大小(size())不会改变,但容量(capacity())会增加到或超过指定的值。
使用 reserve 可以减少因插入新元素而导致的内存重新分配和元素复制的开销,从而提高性能。
reserve 通常用于已知将要向容器中插入大量元素的情况。 - resize:
resize 函数用于改变容器的大小。如果新的大小大于当前大小,那么容器会添加默认值(对于基本类型如 int 是0,对于 std::string 是空字符串)的元素,直到达到指定的大小。如果新的大小小于当前大小,那么容器会删除多余的元素。
resize 会改变容器的大小和可能的容量(如果新的大小大于当前容量,则可能会增加容量)。
使用 resize 可以直接设置容器的大小,并可能同时改变其容量。
- 练习题4:输入n个数,将这n个数按从小到大的顺序输出。
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n;
int a[100];
cin >> n ;
for (int i = 0; i < n; i++) //读入数据
cin >> a[i];
for (int i = 0; i < n; i++) //采用的是简单选择排序,每次最外层的for循环都会选择一个最小的元素放在位置a[i]
for (int j = i + 1; j < n; j++)
if(a[i]>a[j])
swap(a[i], a[j]);
for (int i = 0; i < n; i++) cout << a[i] << ' ';
cout << endl;
return 0;
}
- 练习题5:计算2的N次方。N <= 10000
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int a[100], size = 1, n;
a[0] = 1;
cin >> n;
for (int i = 1; i <=n; i++)
{
a[i] = a[i - 1] * 2;
}
cout << a[n];
cout << endl;
return 0;
}
多维数组
多维数组就是数组的数组。
Int a[3][4]; // 大小为3的数组,每个元素是含有4个整数的数组。
Int arr[10][20][30] = {0}; // 将所有元素初始化为0
链接:多维数组
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MLWkt5IE-1722038796964)(https://i-blog.csdnimg.cn/direct/a9930b00ceef467b96e07257b2750187.png)]
- 练习题:输入一个n行m列的矩阵,从左上角开始将其按回字形的顺序顺时针打印出来。
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n, m;
int arr[50][50];
cin >> n >> m;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
cin >> arr[i][j];
bool st[50][50] = { false };
int dx[4] = { -1,0,1,0 };
int dy[4] = { 0,1,0,-1 };
int d = 1, x = 0, y = 0;
for (int i = 0; i < n * m; i++)
{
int a = x + dx[d], b = y + dy[d];
if (a < 0 || a >= n || b < 0 || b >= m || st[a][b])
{
d = (d + 1) % 4;
a = x + dx[d], b = y + dy[d];
}
cout << arr[x][y] << " ";
st[x][y] = true;
x = a, y = b;
}
cout << endl;
return 0;
}