为二维数组分配空间的办法有哪些?该怎么处理
为二维数组分配空间的办法有哪些?
我用这个方法分配一个二维空间:
int **ptr;
*ptr = new int*[10];
for ( int i = 0; i < 10; i++)
{
ptr[i] = new int[10];
}
这样的话ptr可以当作二维数组使用,但是因为每个元素并不完全是连续存储的,所以这不是真正意义上的数组。
指针和数组本来就是不一样的,但是,有没有办法动态的给二维数组分配连续的地址空间呢?
------解决方案--------------------
template <typename _T, int _X, int _Y>
_T(*)[_X][_Y] Allocate()
{
return reinterpret_cast <_T(*)[_X][_Y]> (new _T[_X*_Y]);
}
template <typename _T, int _X, int _Y>
void Delete(_T (*x)[_X][_Y])
{
delete [] reinterpret_cast <_T*> (x);
}
int (*x)[10][10];
x = Allocate <int, 10, 10> ();
Delete(x);
------解决方案--------------------
int **ptr;
*ptr = new int*[10];
int *pBuf = new int[10*10];
for ( int i = 0; i < 10; i++)
{
ptr[i] = pBuf + 10;
}
------解决方案--------------------
如果第二维维数是固定的话,可以先分配一维数组再强制类型转换。
#include <iostream>
using namespace std;
int main()
{
const int rows=5;
const int cols=3;
int *p = new int[rows*cols];
for (int i=0; i <rows; i++)
for (int j=0; j <cols; j++)
p[i*cols+j] = i+j;
int (*a)[cols] = (int (*)[cols])p;
for (int i=0; i <rows; i++)
{
for (int j=0; j <cols; j++)
cout < < a[i][j] < < " ";
cout < < endl;
}
delete [] p;
return 0;
}
如果第二维维数不固定,那么就不能用上面的方法了。但仍然可以用一维数组模拟二维数组,写一个类封装一下就可以了
class Array2D
{
public:
Array2D(int rows, int cols):_rows(rows), _cols(cols)
{
_data = new int[rows*cols];
}
~Array2D()
{
delete [] _data;
}
int* operator[] (int i)
{
return &_data[i*cols];
}
private:
int *_data;
int _rows, _cols;
};
------解决方案--------------------
用vector吧:
const int size_1 = 20;
const int size_2 = 30;
vector <vector <int> > array(size_1,vector <int> (size_2));//20*30的int数组
------解决方案--------------------
楼主这写错了
int **ptr;
*ptr = new int*[10];
应该是
int **ptr;
ptr = new int*[10];
------解决方案--------------------
template <typename _T, int _X, int _Y>
void Allocate(_T(*&x)[_X][_Y])
{
std::cout < < "Allocate " < <_X*_Y < <std::endl;
x = reinterpret_cast <_T(*)[_X][_Y]> (new _T[_X * _Y]);
}
template <typename _T, int _X, int _Y>
void Delete(_T (*p)[_X][_Y])
{
std::cout < < "Delete " < <_X*_Y < <std::endl;
delete [] reinterpret_cast <_T*> (p);
}
int (*p)[50][2];
Allocate(p);
Delete(p);
豪不丢失类型信息.
我用这个方法分配一个二维空间:
int **ptr;
*ptr = new int*[10];
for ( int i = 0; i < 10; i++)
{
ptr[i] = new int[10];
}
这样的话ptr可以当作二维数组使用,但是因为每个元素并不完全是连续存储的,所以这不是真正意义上的数组。
指针和数组本来就是不一样的,但是,有没有办法动态的给二维数组分配连续的地址空间呢?
------解决方案--------------------
template <typename _T, int _X, int _Y>
_T(*)[_X][_Y] Allocate()
{
return reinterpret_cast <_T(*)[_X][_Y]> (new _T[_X*_Y]);
}
template <typename _T, int _X, int _Y>
void Delete(_T (*x)[_X][_Y])
{
delete [] reinterpret_cast <_T*> (x);
}
int (*x)[10][10];
x = Allocate <int, 10, 10> ();
Delete(x);
------解决方案--------------------
int **ptr;
*ptr = new int*[10];
int *pBuf = new int[10*10];
for ( int i = 0; i < 10; i++)
{
ptr[i] = pBuf + 10;
}
------解决方案--------------------
如果第二维维数是固定的话,可以先分配一维数组再强制类型转换。
#include <iostream>
using namespace std;
int main()
{
const int rows=5;
const int cols=3;
int *p = new int[rows*cols];
for (int i=0; i <rows; i++)
for (int j=0; j <cols; j++)
p[i*cols+j] = i+j;
int (*a)[cols] = (int (*)[cols])p;
for (int i=0; i <rows; i++)
{
for (int j=0; j <cols; j++)
cout < < a[i][j] < < " ";
cout < < endl;
}
delete [] p;
return 0;
}
如果第二维维数不固定,那么就不能用上面的方法了。但仍然可以用一维数组模拟二维数组,写一个类封装一下就可以了
class Array2D
{
public:
Array2D(int rows, int cols):_rows(rows), _cols(cols)
{
_data = new int[rows*cols];
}
~Array2D()
{
delete [] _data;
}
int* operator[] (int i)
{
return &_data[i*cols];
}
private:
int *_data;
int _rows, _cols;
};
------解决方案--------------------
用vector吧:
const int size_1 = 20;
const int size_2 = 30;
vector <vector <int> > array(size_1,vector <int> (size_2));//20*30的int数组
------解决方案--------------------
楼主这写错了
int **ptr;
*ptr = new int*[10];
应该是
int **ptr;
ptr = new int*[10];
------解决方案--------------------
template <typename _T, int _X, int _Y>
void Allocate(_T(*&x)[_X][_Y])
{
std::cout < < "Allocate " < <_X*_Y < <std::endl;
x = reinterpret_cast <_T(*)[_X][_Y]> (new _T[_X * _Y]);
}
template <typename _T, int _X, int _Y>
void Delete(_T (*p)[_X][_Y])
{
std::cout < < "Delete " < <_X*_Y < <std::endl;
delete [] reinterpret_cast <_T*> (p);
}
int (*p)[50][2];
Allocate(p);
Delete(p);
豪不丢失类型信息.