(本文中的代码直接粘贴在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后两个> >中间一定要有空格,否则会被认为是重载。