C++ 中高效的 Sum 和 Assignment 运算符重载
Efficent Sum and Assignment operator overloading in C++
你好,我正在用 c++
实现一个矩阵 class
我知道有很多像 opencv 这样的很棒的库,但我需要自己做。
例如,如果我实现总和,我可以这样做
class Mat{
public:
double* data;
int rows,cols;
Mat(int r,int c):rows(r),cols(c){
data = new double[r*c];
}
};
void Sum(Mat& A,Mat& B,Mat& C){
for (int i = 0; i < A.rows*A.cols; ++i){
C.data[i] = A.data[i]+B.data[i];
}
}
int main(){
//Allocate Matrices
Mat A(300,300);
Mat B(300,300);
Mat C(300,300);
//do the sum
sum(A,B,C);
}
我想要像这样更易读但又不失效率的东西
C = A + B
这样每次都会重新分配 C,我不希望这样
感谢您的宝贵时间
延迟计算。
class MatAccess {
friend class Mat;
friend class MatOpAdd;
virtual double operator[](int index) const = 0;
};
class MatOpAdd: public MatAccess {
friend class Mat;
private:
const MatAccess& left;
const MatAccess& right;
MatOpAdd(const MatAccess& left, const MatAccess& right):
left(left), right(right) {}
double operator[](int index) const {
return left[index] + right[index];
}
};
class Mat: public MatAccess{
public:
double* data;
int rows,cols;
Mat(int r,int c):rows(r),cols(c){
data = new double[r*c];
}
MatOpAdd operator +(const MatAccess& other) {
return MatOpAdd(*this, other);
}
const Mat& operator = (const MatAccess& other) {
for(int i = 0; i < rows*cols; ++i) {
data[i] = other[i];
}
return *this;
}
private:
double operator[](int index) const {
return data[index];
}
double& operator[](int index) {
return data[index];
}
};
int main(){
//Allocate Matrices
Mat A(300,300);
Mat B(300,300);
Mat C(300,300);
//do the sum
C = A + B;
}
现在 '+' 计算将在 "operator="
中完成
我要改变的事情:
MatAccess
应包括维度(行、列)。
Mat
添加构造函数和 operator=
或使其不可复制
Mat::operator+
和 Mat::operator=
检查相等的行,col
- 不再使用时删除内存或
- 使用
std::vector
进行更简单的内存管理。
在这里创建了一个更大的例子:https://gist.github.com/KoKuToru/1d23af4bbf0b2bc89893
你好,我正在用 c++
实现一个矩阵 class
我知道有很多像 opencv 这样的很棒的库,但我需要自己做。
例如,如果我实现总和,我可以这样做
class Mat{
public:
double* data;
int rows,cols;
Mat(int r,int c):rows(r),cols(c){
data = new double[r*c];
}
};
void Sum(Mat& A,Mat& B,Mat& C){
for (int i = 0; i < A.rows*A.cols; ++i){
C.data[i] = A.data[i]+B.data[i];
}
}
int main(){
//Allocate Matrices
Mat A(300,300);
Mat B(300,300);
Mat C(300,300);
//do the sum
sum(A,B,C);
}
我想要像这样更易读但又不失效率的东西
C = A + B
这样每次都会重新分配 C,我不希望这样
感谢您的宝贵时间
延迟计算。
class MatAccess {
friend class Mat;
friend class MatOpAdd;
virtual double operator[](int index) const = 0;
};
class MatOpAdd: public MatAccess {
friend class Mat;
private:
const MatAccess& left;
const MatAccess& right;
MatOpAdd(const MatAccess& left, const MatAccess& right):
left(left), right(right) {}
double operator[](int index) const {
return left[index] + right[index];
}
};
class Mat: public MatAccess{
public:
double* data;
int rows,cols;
Mat(int r,int c):rows(r),cols(c){
data = new double[r*c];
}
MatOpAdd operator +(const MatAccess& other) {
return MatOpAdd(*this, other);
}
const Mat& operator = (const MatAccess& other) {
for(int i = 0; i < rows*cols; ++i) {
data[i] = other[i];
}
return *this;
}
private:
double operator[](int index) const {
return data[index];
}
double& operator[](int index) {
return data[index];
}
};
int main(){
//Allocate Matrices
Mat A(300,300);
Mat B(300,300);
Mat C(300,300);
//do the sum
C = A + B;
}
现在 '+' 计算将在 "operator="
中完成我要改变的事情:
MatAccess
应包括维度(行、列)。Mat
添加构造函数和operator=
或使其不可复制Mat::operator+
和Mat::operator=
检查相等的行,col- 不再使用时删除内存或
- 使用
std::vector
进行更简单的内存管理。
在这里创建了一个更大的例子:https://gist.github.com/KoKuToru/1d23af4bbf0b2bc89893