c ++重载operator []效率

时间:2014-05-08 14:18:06

标签: c++ matrix operator-overloading

我只是想知道如何重载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

3 个答案:

答案 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)尝试两种方式,测量并选择更快的方式。

结果将高度依赖于您使用的编译器以及为该编译器指定的标志。