【发布时间】:2016-12-27 20:18:11
【问题描述】:
我有这个功能:
void foo(const double *const *matrix, unsigned num_rows, unsigned num_columns){
//matrix[0][0] = 5; // ERROR: expression must be a modifiable lvalue
for (unsigned i = 0; i < num_rows; i++) delete matrix[i];
delete matrix;
}
...其中函数无法更改矩阵中任何给定索引处的值,但它仍然能够删除矩阵或其任何行。有没有办法传入一个二维矩阵并保证它不会以任何方式改变?
编辑:看起来没有办法做到这一点,所以我可能会改用向量。
【问题讨论】:
-
我会开始转储原始数组,但使用
std::array<std::array<double,num_rows>,num_cols>或std::vector<std::vector<double>> -
请参阅“1D or 2D array, what's faster?”,了解为什么您很可能不希望拥有二维动态数组数组或
vector<vector<T>>用于(密集)矩阵。我的答案有一个小的矩阵示例类。 (您当然可以只拥有vector<T>并自己处理映射。) -
酷提示,Pixelchemist。但是如果我知道我的矩阵的大小并且知道它永远不会改变,我认为对于作为开发人员和用户的我自己来说,向量向量将更容易可视化。该程序将(静态)图像作为输入并输出一些关于它的数据。我宁愿让用户构建一个二维向量,也不愿让他们学习一维方法。你同意吗?
-
@user3076399:我宁愿有一个带有
Matrix m(20,20);和m[0][0] = 1.0;或m(0, 0) = 1.0;之类的类,因为安全地使用向量向量需要对每个子向量等进行大小/边界检查. -
@Pixelchemist 每个子向量的长度总是相同的,因为矩阵是正方形的。