2016-03-29 91 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(記得邊界檢查第一)。

相關問題