c++重载操作符[]的效率
c++ overloading operator [] efficiency
我只是想知道如何重载运算符[]来访问类中的矩阵,我在这里找到了如何做到这一点。但是,我有一个问题:哪种改变矩阵的方式会更有效?
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:使用"normal"方法:
class CMatrix {
public:
int rows, cols;
int **arr;
public:
void changematrix( int i, int j, int n)
{
arr[i][j]=n;
}
...
修正了changematrix的const
写正确的,可读的代码,让编译器担心效率
如果你有性能问题,并且当你运行分析器来测量性能时(这是你必须在尝试优化之前做的),这段代码显示为性能问题,那么你可以:
1)检查编译器生成的代码的汇编语言解释,启用了完全优化,或者
2)两种方法都试一试,测量一下,然后选择更快的方法。
结果将高度依赖于您正在使用的编译器和您为该编译器指定的标志。
这两种方法都不能像您声明的那样工作
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);
除此之外,我真的会考虑内部布局数据的方式是否最有效。这是一个锯齿数组吗?还是所有行都有相同的宽度?如果这表示一个矩形数组(即所有行都有相同的列数),您可能最好将所有元素存储在单个1D数组中,并使用一些基本算法来定位正确的元素。
相关文章:
- 继承函数的重载解析
- 你能重载对象变量名本身返回的内容吗
- 从父命名空间重载类型
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 重载操作程序时出错>>用于类中的字符串 memebr
- 一个关于在C++中重载布尔运算符的问题
- 不同翻译单元中不可重载的非内联函数定义
- 为什么使用SFINAE而不是函数重载
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- 将重载的成员函数传递给函数模板
- c++:可变模板和函数重载
- 重载元组索引运算符-C++
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 重载==不适用于二进制树
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 重载运算符new[]的行为取决于析构函数
- 正在尝试重载二进制搜索树分配运算符
- C++中的效率和赋值运算符重载
- c++重载操作符[]的效率