(本文中的代码直接粘贴在main函数下即可使用,部分代码需在最后一行添加return 0;)
(用到的头文件:#include <vector>
#include <iostream>
#include <iomanip> )
静态二维数组的声明:
C++中,创建2维数组可以使用最简单的命令:
int a[2][3]={{1,2,3},{4,5,6}};
这种类型的数组在编译时就已经分配好了内存,若我们要建立一个在运行时才决定大小的数组,则不能使用这种方法,如果用下列声明创建数组:
int size;
cin >> size;
int matrix2D[size][size];
则会报错:
在运行时才确定大小的数组叫做动态数组,动态数组不能够在编译时被分配空间。
一维动态数组的声明:
若要让系统在运行时才分配空间给数组,则需要使用特殊方法,下面是在C++中创建一维动态数组的方法:
1 int size; //声明数组尺寸
2 int i; //循环控制变量
3
4 cout << "Please enter the size: ";
5 cin >> size; //输入数组尺寸
6 int *matrix1D = new int[size]; //创建数组
7
8 for (i = 0; i < size; i++)
9 matrix1D[i] = rand() % 10; //按顺序赋值
10
11 for (i = 0; i < size; i++)
12 cout << matrix1D[i] << " "; //按顺序读取
13
14 delete[] matrix1D; //释放空间
运行结果如下:
在上述程序第6行的代码中, new运算符返回第一个元素的地址,该地址被赋予指针matrix1D。
由于matrix1D指向数组中的第一个元素,*matrix1D即为数组第一个元素的值,但是在C/C++中,matrix1D[0]可以直接指代数组中的第一个元素,对于第二个元素,可以使用matrix1D[1]操作。
二维动态数组的声明:
1 int size_row,size_column;
2 int r,c;
3 cout << "Please enter the size of row: ";
4 cin >> size_row;
5 cout << "\nPlease enter the size of column: ";
6 cin >> size_column;
7
8 int **matrix2D = new int*[size_row];
9 for (r = 0; r < size_row; r++)
10 matrix2D[r] = new int[size_column]; //创建数组
11
12 for (r = 0; r < size_row; r++)
13 for (c = 0; c < size_column;c++)
14 matrix2D[r][c] = rand() % 10; //赋值
15
16 for (r = 0; r < size_row; r++)
17 {
18 cout << endl;
19 for (c = 0; c < size_column; c++)
20 {
21 cout << matrix2D[r][c] << " ";
22 }
23 } //读取
24
25 for (int r = 0; r < size_row; r++)
26 {
27 delete matrix2D[r];
28 matrix2D[r] = NULL;
29 }
30 delete[size_row]matrix2D;
31 matrix2D = NULL; //释放
运行结果如下:
对于2维数组可以将其理解为几个一维行向量的叠加。
代码第8行中 , 声明 matrix2D是列向量matrix2D[0] matrix2D[1] matrix2D[2]的指针,向量中的元素个数与总行数相等。
9,10行的循环表示这个列向量中的每个元素都是一个行向量的指针,即matrix2D[0]是行向量matrix2D[0][1] matrix2D[0][2] matrix2D[0][3] matrix2D[0][4]的指针,这个道理与一维动态数组一致。
使用二维动态数组时可以直接使用例如matrix2D[1][2]来指代第二行第3列的元素。
释放2维动态数组时也与1维有所不同,除了上述代码中的方法外,比较通用并且简便的方法有:
for (int r = 0; r < size_row; r++)
delete[] matrix2D[r];
delete[] matrix2D; //释放
第1,2行先释放每行中分配的空间 即指针数组(matrix2D[0] matrix2D[1] matrix2D[2])每个元素指向的数组,如(matrix2D[0][0],matrix2D[0][1],matrix2D[0][2],matrix2D[0][3],...,)。
第3行再释放这个指针数组。
二维动态数组的建立也可以用模板类vector:
使用vector之前要加载头文件#include <vector>
1 int row, column;
2 int r, c;
3 cout << "Please enter the row" << endl;
4 cin >> row;
5 cout << "Please enter the column" << endl;
6 cin >> column;
7
8 vector<vector<int> > vector2D(row, vector<int>(column));
9
10 for (r = 0; r < row; r++)
11 {
12 for (c = 0; c < column; c++)
13 vector2D[r][c] = rand() % 10;
14 }
15
16 for (r = 0; r < row; r++)
17 {
18 for (c = 0; c < column; c++)
19 {
20 cout << setw(2)<< vector2D[r][c] ;
21 }
22 cout << endl;
23 }
使用方法如上,声明时int后两个> >中间一定要有空格,否则会被认为是重载。