C++ 中的动态二维数组简介
C++ 中动态二维数组的介绍。
引言
动态数组是一种可以调整大小的数据结构,允许添加或删除元素。
在 C++ 中创建动态二维数组有很多种方法。
1. 指向指针的指针
首先,我们将为包含一组指针的数组分配内存。 接下来,我们将为指针指向的每个数组分配内存。 内存的释放顺序与内存分配的顺序相反。
int **dynamicArray = 0; //memory allocated for elements of rows. dynamicArray = new int *[ROWS] ; //memory allocated for elements of each column. for( int i = 0 ; i < ROWS ; i++ ) dynamicArray[i] = new int[COLUMNS]; //free the allocated memory for( int i = 0 ; i < ROWS ; i++ ) delete [] dynamicArray[i] ; delete [] dynamicArray ;
上面的代码是针对整数值而言的。 我们可以使用模板来操作通用类型。 在下面的示例中,对于内存分配,使用了 AllocateDynamicArray
函数模板,而对于释放内存,使用了 FreeDynamicArray
。
template <typename T> T **AllocateDynamicArray( int nRows, int nCols) { T **dynamicArray; dynamicArray = new T*[nRows]; for( int i = 0 ; i < nRows ; i++ ) dynamicArray[i] = new T [nCols]; return dynamicArray; } template <typename T> void FreeDynamicArray(T** dArray) { delete [] *dArray; delete [] dArray; } int main() { int **my2dArr = AllocateDynamicArray<int>(4,4); my2dArr[0][0]=5; my2dArr[2][2]=8; cout << my2dArr[0][0] << my2dArr[0][1] << endl; cout << my2dArr[1][1] << my2dArr[2][2]<< endl; FreeDynamicArray<int>(my2dArr); return 0; }
2. 向量的向量
可以使用一行代码通过使用向量的向量(即包含向量数组的向量)来完成上述代码。
vector<vector<T> > dynamicArray(ROWS, vector<T>(COLUMNS)); #include <vector> using namespace std; #define ROWS 4 #define COLUMNS 4 //vector<int > vec(5, 7); create a vector with //5 elements and each element will have the value 7. vector<vector<int> > dynamicArray(ROWS, vector<int>(COLUMNS)); for(int i = 0;i < dynamicArray.size();++i) { for(int j = 0;j < dynamicArray[i].size();++j) { dynamicArray[i][j] = i*j; } } for(int i = 0;i < dynamicArray.size();++i) { for(int j = 0;j < dynamicArray[i].size();++j) { cout << dynamicArray[i][j] << endl; } }
3. 向量包装类
我们创建了一个包装类 DynamicArray
,其中包含一个 vector<vector<T> > dArray
数据成员。 然后,我们将行数和列数作为参数传递给构造函数。
template <typename T> class DynamicArray { public: DynamicArray(){}; DynamicArray(int rows, int cols): dArray(rows, vector<T>(cols)){} vector<T> & operator[](int i) { return dArray[i]; } const vector<T> & operator[] (int i) const { return dArray[i]; } void resize(int rows, int cols)//resize the two dimentional array . { dArray.resize(rows); for(int i = 0;i < rows;++i) dArray[i].resize(cols); } private: vector<vector<T> > dArray; }; void Matrix(int x, int y) { DynamicArray<int> my2dArr(x, y); my2dArr[0][0] = -1; my2dArr[0][1] = 5; cout << my2dArr[0][0] << endl; cout << my2dArr[0][1] << endl; } int main(){ Matrix(2,2); return 0; }