2014-05-08 44 views
-1

我只是想知道如何重載運算符[]來訪問一個類中的矩陣,並且我發現如何去那個here。 但是,我對此有個疑問:更換矩陣的哪種方法會更有效率?C++重載運算符[]效率

1:重載operator []:(從以前的鏈接提取的代碼)

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:使用一個 「正常」 的方法:

class CMatrix { 
public: 
    int rows, cols; 
    int **arr; 

public: 
    void changematrix(int i, int j, int n) 
    { 
     arr[i][j]=n; 
    } 
... 

編輯:於changematrix固定常數

+2

1.這些甚至等價的代碼? 2.你正在從一個'const'函數改變狀態? – crashmstr

+1

我會建議重載函數操作符而不是索引操作符。 – Codor

+0

在繼續之前,請考慮您是否真的需要這種訪問。在很多情況下,簡單地重載operator()以訪問元素會更簡潔;這使得代碼更容易理解,使用簡單並且不需要這種解決方法。 – MatthiasB

回答

0

編寫正確,可讀的代碼,讓編譯器擔心效率。

如果您有性能問題,如果當你運行一個分析器來衡量性能(你必須努力優化前做)這個代碼顯示爲一個性能問題,那麼您可以:

1)檢查編譯器生成的代碼的彙編語言解釋並啓用完全優化,或者

2)嘗試兩種方法,測量並選擇更快的代碼。

結果將高度依賴於您正在使用的編譯器以及您爲該編譯器指定的標誌。

+0

它應該按照我在編輯中使用的方式工作嗎? –

+0

你沒有顯示'arr'成員的初始化(並且你沒有使用'rows,cols'成員)如果'arr'設置正確,那麼'changematrix()'方法看起來是正確的。如果數據是2D矩陣,而不是矢量,那麼'operator []'方法對我來說沒有意義 - 您試圖使用單個索引訪問元素(除非您要求調用者執行指數計算 - 在這種情況下,我會說:不這樣做。) –

0

這兩種方法都將作爲您已聲明

int **arr; 

沒有給出行長信息爲:

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

我會去的第三個選項,使用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); 

除此之外,我真的會考慮是否方式在內部佈置數據是最有效的。這是一個參差不齊的數組嗎?或者所有的行都有相同的寬度?如果這代表了一個矩形整形數組(即所有行都有相同數量的列),您可能會更好地將所有元素存儲在單個一維數組中,並使用一些基本算術來定位正確的元素。