2016-03-29 87 views
0

我已经定义了一个矩阵类,并且重载了+运算符以便能够将这个类的实例一起添加。使用超载添加两个矩阵的最佳方法是什么?

class Matrix{ 
public: 
vector<vector<int>> a; 


Matrix & operator+(const Matrix& b) 
{     
    vector<vector<int>>::const_iterator it0=b.a.begin(); 
    vector<vector<int>>::iterator it1=this->a.begin(); 
    vector<int>::iterator it2=it1->begin(); 
    vector<int>::iterator it3=it1->end(); 
    vector<int>::const_iterator it01=it0->begin(); 

    for(it1;it1!=this->a.end();it1++) 
     { 
     it2=it1->begin(); 
     it3=it1->end(); 
     it01=it0->begin(); 
     it0++; 
      // a.begin(),a.end(),b.begin(),ret.begin() 
     std::transform(it2,it3,it01,it2,std::plus<int>()); 
    } 
      return *this; 
} 

}; 

但后来,还存在这样做的另一种方式,

class Matrix{ 
public: 
vector<vector<int> > a; 

Matrix & operator + (const Matrix &y) { 

for (int m=0; m<y.a.size(); ++m) { 
    for (int n=0; n<y.a[0].size(); ++n) { 
     this->a[m][n] = this->a[m][n] + y.a[m][n]; 
    } 
} 

return *this; 
}}; 

第二种形式是更短的,但直接使用阵列,而第一个使用迭代器。也许可以用更短的方式用迭代器来做到这一点,我不确定。我已经用简单的案例进行了测试,它们似乎同样高效。 这样做的正确方法是什么?

+2

无论你认为更可读性是“最好的方式”。如果两种方式表现相同,只要选择看起来更清晰的任何东西。 –

+0

个人而言,我更喜欢第二种方法,因为它更简洁明了代码的功能。如果您使用的是C++ 11,则可以考虑使用[基于范围的循环](http://en.cppreference.com/w/cpp/language/range-for)来使事情更清晰。 –

+0

第二个人,你不是指'+ ='吗? – o11c

回答

0

对于非平凡的类(例如包括std::vector的类),就地操作通常比分配新对象更便宜,然后(可能)销毁一个或两个参数。但是,积极使用右值引用重载可以稍微缓解这一点。不管哪个函数实现我用的,我不会用嵌套std::vector小号

注 - 我要么使用单一std::vector或更好的std::unique_ptr<T[]>然后计算指数y*w+x(记得边界检查第一)。

相关问题