C++ c++;重载运算符[]效率

C++ c++;重载运算符[]效率,c++,matrix,operator-overloading,C++,Matrix,Operator Overloading,我只是想知道如何重载操作符[]来访问类中的矩阵,我发现了如何实现这一点。 但是,我有一个问题:哪种改变矩阵的方法更有效 1:重载运算符[]:(从上一个链接提取的代码) 编辑:我太依赖另一个例子了:它应该这样工作吗 int* operator[]( int const x ) { return &arr[x]; } 2:使用“正常”方法: 编辑:changematrix上的固定常量这两种方法都不能像您声明的那样工作 int **arr; 不提供以下内容的

我只是想知道如何重载操作符[]来访问类中的矩阵,我发现了如何实现这一点。 但是,我有一个问题:哪种改变矩阵的方法更有效

1:重载运算符[]:(从上一个链接提取的代码)

编辑:我太依赖另一个例子了:它应该这样工作吗

   int* operator[]( int const x )
   {
      return &arr[x];
   }
2:使用“正常”方法:


编辑:changematrix上的固定常量

这两种方法都不能像您声明的那样工作

 int **arr;
不提供以下内容的行长度信息:

  return &arr[0][y];
  arr[i][j]=n;

我会选择第三个选项,使用
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);
CMatrix m=。。。
m(1,2)=5;

std::cout编写正确、可读的代码,让编译器担心效率

如果您有性能问题,并且当您运行探查器来测量性能(在尝试优化之前必须这样做)时,此代码显示为性能问题,那么您可以:

1) 在启用完全优化的情况下,检查编译器生成的代码的汇编语言解释,或

2) 尝试两种方法,测量并选择速度更快的一种


结果将在很大程度上取决于您使用的编译器以及为该编译器指定的标志。

1。这些代码是等价的吗?2.您正在从
const
函数更改状态?我建议重载函数运算符而不是索引运算符。继续之前,请考虑是否确实需要这种访问。在许多情况下,简单地重载操作符()进行元素访问更为简洁;这使得代码更容易理解,使用更简单,并且不需要这种解决方法。您可以不使用运算符[],而是使用运算符()(无符号行,无符号列)使其易于编译。这两个版本似乎都不可编译。您正在双指针上应用2索引运算符。您应该将
arr[i][j]
更改为
arr[i*cols+j]
。两种方法看起来都一样,只是第一种方法有语法上的糖分。您没有显示
arr
成员的初始化(并且您没有使用
行、cols
成员)。如果
arr
设置正确,则
changematrix()
方法看起来是正确的。如果数据是2D矩阵,而不是向量,那么
操作符[]
方法(对我来说)就没有意义——您试图使用单个索引访问元素(除非您要求调用方进行索引计算——在这种情况下,我会说:不要这样做)
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);