C++数组
C++数组(array)是一种顺序容器sequence container,是由单一数据类型元素组成的一个有序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。对数组元素的访问是通过下标(subscript)操作符,按元素在数组中的位置进行访问,称为索引访问(indexing)或下标访问(subscripting)。数组是一种组合类型,是不能作为一个整体进行访问和处理的,只能按元素进行个别的访问和处理。
C++中的一维数组
声明数组
在C++在声明一个数组,需要指定元素的类型和元素的数量,格式如下:
数据类型 数组名[元素数量];
上面声明的格式是一维数组的声明,其中元素个数必须是一个大于0的整型常量,数据类型可以是任意有效的C++数据类型。如声明一个类型为double的包含10个元素的数组myA,声明语句是: double myA[10];
注意,数组以 0 作为它们第一个元素的索引,也被称为基索引,数组的最后一个索引是数组的总大小减去 1。
初始化数组
在C++中,可以逐个初始化数组,也可以使用一个初始化语句,如下所示:
double myA[5] = {1000.0, 2.0, 3.4, 7.0, 50.0};
大括号{ }之间的值的数目不能大于在数组声明时在方括号[ ]中指定的元素数目。
如果省略掉了数组的大小,数组的大小则为初始化时元素的个数。因此,如果是下面的格式,将创建一个数组,它与前一个实例中所创建的数组是完全相同的
double myA[] = {1000.0, 2.0, 3.4, 7.0, 50.0};
为数组中某个元素赋值的实例,下面的语句把数组中第五个元素的值赋为666.6。所有的数组都是以0作为它们第一个元素的索引,也被称为基索引,数组的最后一个索引是数组的总大小减去1。
myA[4] = 666.6;
访问数组元素
数组元素可以通过数组名称加索引进行访问。元素的索引是放在方括号内,跟在数组名称的后边。例如:
double salary = myA[3];
声明数组、初始化数组、访问数组元素实例如下:
#include "iostream"
#include "iomanip"
using namespace std;
using std::setw; // setw() 函数来格式化输出
int main(){
int a[10]; // 声明一个包含10个元素的整型数组
// 初始化数组
for (int i = 0; i < 10; i++)
a[i] = i + 100;
cout << "元素索引" << setw(13) << "元素值" << endl;
// 输出数组中的每个元素
for (int j = 0; j < 10; j++)
cout << setw(7) << j << setw(13) << a[j] << endl;
return 0;
}
运行之,参见下图:
C++中的多维数组
C++支持多维数组。多维数组声明的一般形式如下:
数据类型名 数组名[size1][size2]...[sizeN];
例,下面的声明创建了一个三维整型数组:
int tridim[5][10][4];
二维数组
多维数组最简单的形式是二维数组。一个二维数组,在本质上,是一个一维数组的列表。声明一个x行y列的二维整型数组,形式如下:
数据类型 数组名[x][y];
例、定义一个整型的包含3行和4列的二维数组:
int a[3][4]
一个二维数组可以被认为是一个带有x行和y列的表格。对于int a[3][4] 这个3行(Row)和4列(Column)的二维数组,示意如下:
数组中的每个元素是使用形式为a[i][j]的元素名称来标识的,其中a是数组名称,i和j 是唯一标识a中每个元素的下标。
初始化二维数组
int a[3][4] = {
{0, 1, 2, 3}, /* 初始化索引号为 0 的行 */
{4, 5, 6, 7}, /* 初始化索引号为 1 的行 */
{8, 9, 10, 11}, /* 初始化索引号为 2 的行 */
};
内部嵌套的括号是可选的,下面的初始化与上面是等同的:
int a[3][4] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
访问二维数组元素
二维数组中的元素是通过使用下标(即数组的行索引和列索引)来访问的。例如:
int val = a[2][3];
例、使用嵌套循环来处理前面定义的二维数组:
#include <iostream>
using namespace std;
int main ()
{
// 一个带有 3 行 4列的数组
int a[3][4] = {
{0, 1, 2, 3}, /* 初始化索引号为 0 的行 */
{4, 5, 6, 7}, /* 初始化索引号为 1 的行 */
{8, 9, 10, 11}, /* 初始化索引号为 2 的行 */
};
// 输出数组中每个元素的值
for ( int i = 0; i < 3; i++ )
for ( int j = 0; j < 4; j++ )
{
cout << "a[" << i << "][" << j << "]: ";
cout << a[i][j]<< endl;
}
return 0;
}
运行之,参见下图:
C++数组的动态建立及输入
这涉及到vector容器的使用,故简要介绍之。vector容器:能够存放任意类型的动态数组,常用基本操作:
1)头文件#include<vector>
2)创建一维vector对象,vector<int> vec;二维vector<vector<int>> vec2;
3)尾部插入数字:vec.push_back(a);
4)尾部元素弹出:vec.pop_back();相当于删除尾部元素。
5)使用下标访问元素,cout<<vec[0]<<endl;记住下标是从0开始的,和数组的访问形式一样。
6)插入元素:vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a。
7)删除元素:vec.erase(vec.begin()+2);删除第3个元素。
vec.erase(vec.begin()+i,vec.end()+j);删除区间[i,j-1];区间从0开始。
8)向量大小:vec.size()。
9)清空:vec.clear()。
10)初始化赋值:
vector c1(c2) // 复制一个vector(c2也是一个vector)
vector c(n) // 创建一个vector,含有n个数据,数据均已缺省构造产生
vector c(n, elem) // 创建一个含有n个elem元素的vector
vector c(beg,end) // int array[]={1,2,3},beg=array,end=array+3,用数组为vector赋值
11)判断是否为空:vec.empty()。
先看一维数组的动态建立及输入,并输出验证的例:
#include <iostream>
#include <vector>
using namespace std;
int main(){
vector<int> vector1;
int inputnum=0;
cout << "数组元素个数:";
cin >>inputnum;
int temp = 0;
cout << "数组元素值:";
for (int i = 0; i < inputnum; i++)//输入一维数组
{
cin >> temp;
vector1.push_back(temp);
};
//输出验证
for (int i = 0; i < inputnum; i++)//打印输入的数组
{
cout << vector1[i] << " ";
}
return 0;
}
运行之,参见下图:
再看二维数组的动态建立及输入,并输出验证的例:
#include <iostream>
#include <vector>
using namespace std;
int main(){
int r = 0, c = 0;
cout << "row:";
cin >> r; //输入二维数组的行数
cout << "col:";
cin >> c;//输入二维数组的列数
vector<vector<int> >array;//定义二维数组
vector<int>v;//定义一维数组
array.clear();//将二维数组清空,即初始化
int temp = 0;
cout << "数组元素值:";
for (int i = 0; i < r; i++)//输入r*c的二维数组
{
v.clear();//子数组返回时要清除
for (int j = 0; j < c; j++)
{
cin >> temp;
v.push_back(temp);
}
array.push_back(v);
}
//输出验证
for (int i = 0; i < r; i++)//打印输入的二维数组
{
for (int j = 0; j < c; j++)
{
cout << array[i][j] << " ";
}
printf("\n");
}
return 0;
}
运行之,参见下图:
最后,简单介绍三维数组。
array[a][b][c]
如何理解三维数组含义:可以理解为该数组有a页,每一页都有一个b行c列的二维数组。参见下图:
声明三维数组,如:
int myarray[2][3][4];
初始化数组:
int arr[2][3][4] = {1, -1 ,2 ,-2 , 3 , -3, 4, -4, 5, -5, 6, -6,
7,-7,8,-8,9,-9,10,-10,11,-11,12,-12};
三维数组示例
#include <iostream>
using namespace std;
int main(){
// initializing the array
int arr[2][3][4] = {1, -1 ,2 ,-2 , 3 , -3, 4, -4, 5, -5, 6, -6,
7,-7,8,-8,9,-9,10,-10,11,-11,12,-12};
// displaying array values
for (int x = 0; x < 2; x++) {
cout <<"第"<< x << "层"<< endl;
for (int y = 0; y < 3; y++) {
for (int z = 0; z < 4; z++) {
cout<<arr[x][y][z]<<" ";
}
cout << endl;
}
}
return 0;
}
运行之,参见下图: