2017-08-16 38 views
0

我想有一個類中獲得多維數據,我發現:過載()算多維數據訪問

爲了提供多維數組訪問語義,例如要實現一個三維數組訪問一個[i] [j] [k] = x ;,運算符[]必須返回一個2D平面的引用,該平面必須有它自己的運算符[],它返回一個1D行的引用,它必須具有返回元素引用的operator []。爲避免這種複雜性,一些庫選擇重載operator(),以便3D訪問表達式具有像Fortran一樣的語法a(i,j,k)= x;

http://en.cppreference.com/w/cpp/language/operators

,我想使用建議的語法,但我有實現麻煩。我該如何編寫重載賦值運算符來這樣工作?

+0

'Eigen'庫可能就是這樣做的。另外:你有什麼困難? –

+1

是的,我用Eigen,但有趣的事情,這次gcc 4.6是我的極限...... :(但是好主意,我會嘗試搜索他們是如何做到的 – corwin

+1

你不需要重載賦值操作符。 – HolyBlackCat

回答

3

例如,這將是

template <typename T, std::size_t S1, std::size_t S2, S3> 
struct Matrix3D 
{ 
    // ... 

    const T& operator()(std::size_t i, std::size_t j, std::size_t k) const { 
      return data[i][j][k]; 
    } 
    T& operator()(std::size_t i, std::size_t j, std::size_t k) { 
      return data[i][j][k]; 
    } 
private: 
    T data[S1][S2][S3]; 
}; 
0

感謝您的幫助,我有一個解決辦法:

T& operator()(unsigned width, unsigned height) { 
    return my_data[width + height * data_width]; 
} 

是雙向的:

my_class(1,2) = value; 
value = my_class(1,2); 
0

您可以使用一維數組而不是3D。它會更容易,並會表現更好。

typedef struct Tensor 
{ 
    Tensor(int x,int y, int z) 
     :a(x*y*z),xSize(x),ySize(y) 
    { 
    } 
    int& operator()(int x, int y, int z) 
    { 
     return a[x + (y*xSize) + (z*ySize*xSize)]; 
    } 
    private: 
    std::vector<int> a; 
    int xSize; 
    int ySize; 
}Tensor; 

int main() 
{ 
    int x=5; 
    int y=10; 
    int z=15; 
    Tensor t(x,y,z); //constructor 
    return t(5,6,7); // operator() 
} 

您還可以使用模板使其適用於不同的數據類型。

+0

'new int [x,y,z]'不符合你的想法。你應該避免原始擁有指針,而是使用'std :: vector'(或'std :: unique_ptr')。 – Jarod42