C++ 创建动态二维数组
在C++中创建数组的时候需要声明数组的长度,在声明一个二维数组的参数时,则至少需要确认第二维的长度,否则就无法完成编译。 为什么呢,我们可以用一张图来表示c++二维数组在内存中的表示就理解了。
实际上在创建数组的时候,c++是根据最低维,也就是最靠后的那个维度最大值来分配连续内存空间的。譬如int[2][5]
就会分配10*4个字节空间出来,如果不知道最后一个维度,c++就不知道如何开辟内存空间了。
二维数组返回的就是整个数组的首元素地址。 而访问则是根据最后维的长度进行运算后得出:
/*
* c++ 二维数组
*
* hello@shezw.com 2020.07.03
*/
#include <iostream>
#include <string>
using namespace std;
int main()
{
int a[2][5] = {1,2,3,4,5,6,7,8,9,10};
for( auto e:a ){
printf( "%p : %d \n",e,*e );
}
printf( "%p : %d \n",&a[1][3],a[1][3] );
printf( "%p : %d \n",&a[0][8],a[0][8] );
}
输出:
0x7fffa508a870 : 1
0x7fffa508a884 : 6
0x7fffa508a890 : 9
0x7fffa508a890 : 9
可以看到 a[0][8]
其实是完全等价于 a[1][3]
的,实际上a[1][3]
就是从第一个空间开始往后数第3+1*5 = 8
个。
在数据结构、算法与应用一书中约定了一种动态创建二维数组的方式。
这种方式的核心是 先构造一维指针数组,再将每个指针指向对应列的首元素。
为了调用和使用方便,我这里设计一个Matrix模板类,专门用于这样的动态二维数组的使用。
/*
* c++ 二维数组
*
* hello@shezw.com 2020.07.03
*/
#include <iostream>
#include <string>
using namespace std;
template <typename T>
class Matrix{
private:
T ** _elements;
int _colSize;
int _rowSize;
public:
Matrix( int rows, int cols ){
_colSize = cols;
_rowSize = rows;
_elements = new T * [rows];
for( int i=0;i<rows;i++ ){
_elements[i] = new T [cols]();
}
}
~Matrix(){
for( int i=0;i<_rowSize;i++ ){
delete [] _elements[i];
}
delete [] _elements;
}
int getSize(){ return _colSize * _rowSize; };
int colSize(){ return _colSize; };
int rowSize(){ return _rowSize; };
// 函数形式
const T & get( int row, int col ){
return _elements[row][col];
}
// 重载操作符形式
T* & operator[]( int row ){
return _elements[row];
}
// 重载操作符形式 只读
const T* & operator[]( int row) const{
return _elements[row];
}
void print(){
for( int i=0; i< _rowSize; i++ ){
printf( "\n row %p: \n", _elements[i] );
for( int j=0; j< _colSize; j++ ){
printf( " col %p - %d\n", &_elements[i][j], _elements[i][j] );
}
}
}
};
int main()
{
Matrix<int> m(3,5);
m[2][1] = 15;
m.print();
}
最近回复