我正在学习c++。我在做初始化列表的练习,所以我做了一个这样的类
class Matrix
{
public:
const int x_size;
const int y_size;
int *data;
Matrix(int _x_size, int _y_size) : x_size(_x_size), y_size(_y_size)
{
data = new int[y_size][x_size];
}
~Matrix()
{
delete[][] data;
}
};
int main(void)
{
Matrix A = Matrix(10, 10);
return 0;
}
编译器说:new操作符的数组大小必须是常量。所以我搜索了一下,有人说,这些不是"编译器时间常数"。
但是很明显,我不能在这里使用这个大小的宏…然后。我应该如何得到适当大小的数组与构造函数?
如果你只是在学习c++,那么最好的建议是远离内存管理。如果可以的话,使用stl类型。使用std::vector来替换该数组:
std::vector<std::vector<int>> data;
创建如下:
data(y_size, std::vector<int>(x_size, 0));
,并像这样访问它:
data[i][j];
正如jaunchopanza所说,你也可以使用1D数组,这可能会更好。您将以类似的方式创建和编辑它:
std::vector<int> data;
data(y_size * x_size, 0);
data[y_size*i + j];
的优点是访问速度更快,特别是当x_size
和y_size
比较大的时候。还有一个优点是,向量的向量可以存储在所有地方,因为每一行(或列)将存储在内存中的不同位置。如果您打算获取与多行(或多列)重叠的数据,那么为了提高速度,最好使用1D数组。
你可以在这里找到更多信息:http://en.cppreference.com/w/cpp/container/vector
如果你想把它变成一个矩阵来做数学运算等等。我会强烈推荐Eigen
,它是迄今为止最好的矩阵库:http://eigen.tuxfamily.org/index.php?title=Main_Page
你应该这样写STH(尽管它不是异常安全的)
class Matrix
{
public:
const int x_size;
const int y_size;
int ** data;
Matrix(int _x_size, int _y_size) : x_size(_x_size), y_size(_y_size)
{
data = new int* [y_size];
for(int i =0 ; i < y_size ; i++)
{
data[i] = new int[x_size] ;
}
}
~Matrix()
{
for(int i= 0 ; i < y_size ; i++)
{
delete [] data[i];
}
delete[] data;
}
};