我只是想知道如何重载operator []以访问类中的矩阵,我找到了here的方法。 但是,我有一个问题:改变矩阵的哪种方式会更有效率?
1:重载运算符[] :(从上一个链接中提取的代码)
class CMatrix {
public:
int rows, cols;
int **arr;
public:
int* operator[]( int const y )
{
return &arr[0][y];
}
....
编辑:我过于依赖另一个例子:它应该以这种方式工作吗?
int* operator[]( int const x )
{
return &arr[x];
}
2:使用“正常”方法:
class CMatrix {
public:
int rows, cols;
int **arr;
public:
void changematrix( int i, int j, int n)
{
arr[i][j]=n;
}
...
编辑:修复了变更矩阵上的const
答案 0 :(得分:0)
这两种方法都不会像你宣布的那样工作
int **arr;
没有给出以下行长信息:
return &arr[0][y];
arr[i][j]=n;
答案 1 :(得分:0)
我会使用operator()
而不是operator[]
来寻找第三种选择:
int& operator()(size_t i, size_t j) {
return arr[i][j];
}
int operator()(size_t i, size_t j) const {
return arr[i][j];
}
然后用户将执行:
CMatrix m = ...
m(1,2) = 5;
std::cout << m(1,2);
除此之外,我真的会考虑在内部布置数据的方式是否最有效。这是一个锯齿状的阵列吗?或者所有行都有相同的宽度?如果这表示矩形形状的数组(即所有行具有相同的列数),则最好将所有元素存储在单个1D数组中,并使用一些基本算法来定位正确的元素。
答案 2 :(得分:0)
编写正确,可读的代码,让编译器担心效率。
如果您遇到性能问题,并且当您运行分析器来衡量性能(在尝试优化之前必须执行此操作)时,此代码会显示为性能问题,那么您可以:
1)检查编译器生成的代码的汇编语言解释,并启用完全优化,或
2)尝试两种方式,测量并选择更快的方式。
结果将高度依赖于您使用的编译器以及为该编译器指定的标志。