【发布时间】:2021-12-19 19:21:32
【问题描述】:
为 Matrix 分配内存的最佳选择是什么?
我需要在 first Mat Constructor 中分配内存。
second Mat 构造函数需要 1 个参数,当 Matrix 被认为是一维数组时,行数将为 1。我还必须在第二个构造函数中分配内存。
矩阵数据应为double
这是我尝试过的:
#include<iostream>
class Mat{
uint16_t rows;
uint16_t colls;
double *mData; // the 2D array// matrix
Mat(uint16_t r, uint16_t c){ // constructor with 2 parameters -
// alocating memory for matrix
this-> rows = r;
this-> colls = c;
this-> mData = new double [rows][colls];
}
Mat(uint16_t x){ //constructor with 1 parameter // alocating memory
//for the case when number of rows = 1 , so the matrix becomes 1D array[]
this-> rows = x;
this-> mData = new double [rows];
}
};
我不擅长指针,所以我无法弄清楚我错过了什么。
“数组大小不是一个常数表达式”
--更新--
完整请求: 通过实现其内容来创建 Mat 类,如下所示:
该类必须包含 2 个私有属性,称为 mCols 和 mRows。这些是矩阵的维度,它们的类型是没有 16 位标记的 16 位整数。
该类必须包含 1 个名为 mData 的私有属性。这是一个指向双精度小数的指针,该指针的内存将在构造函数中分配。
一个构造函数,它接受两个无标记整数作为参数,表示数组的行数和列数,并分配内存来存储这些值。
第二个构造函数将单个数字作为参数。在这种情况下,数组被认为是一个向量,行数默认为 1,接收到的参数表示列数。当然,在这种情况下也必须分配能够存储数字的内存。
第三个不带任何参数的构造函数。它只会初始化值为0的整数属性。
第四个构造函数,它将是复制构造函数。它接收 const Mat & 类型的对象作为参数,其作用是将给定对象的所有属性值作为参数复制到当前对象 (this) 中。
新代码:
class Mat{
private:
uint16_t mRows;
uint16_t mCols;
double *mData;
public:
Mat(uint16_t r, uint16_t c){
mRows = r;
mCols = c;
mData = new double[mRows * mCols];
}
Mat(uint16_t c){
mCols = c;
mRows = 1;
mData = new double [1 * mCols];
}
Mat(){
mRows = 0;
mCols = 0;
}
Mat(const Mat &mat) : mRows(mat.mRows), mCols(mat.mCols), mData(mat.mData){
}
};
【问题讨论】:
-
宁可使用
std::vector<uint16_t>大小的rows * cols,并为您的Mat类提供uint16_t operator()(int row, int col)。互联网上有很多例子,如何做到这一点。 -
最好的选择是不要。使用
std::vector。 Something like this 是矩阵类的默认起点。 -
如果在编译时知道大小,而且通常是这样,你可以使用模板
-
附注帮助您简化代码:一维数组是二维数组,其中一个维度的大小始终为 1。
-
你真的需要一个单行的特殊情况吗?只需使用第一个构造函数并为行传递 1。
标签: c++ arrays class heap-memory