2017-08-25 33 views
0

連續地分配我想有以定義在C堆一般多維數組++的能力,並且我想分配連續的存儲到所述陣列用於快速訪問的元素,(而不是鋸齒狀向量)。這是我實現多維數組的實現在存儲器

#include <iostream> 
#include <vector> 
#include <stdexcept> 

using namespace std; 

typedef vector<unsigned int> VUI; 

class Invalid_MDArray : public exception{ 
public: 
    char* what(){ 
     return "Array cannot be constructed "; 
    } 
}; 

template <class T> 
class MArray{ 
private: 
    VUI dsize; 
    VUI cumsize; 
    T* p; 
    unsigned int stot; 

public: 

    unsigned int size(){ return stot; } 
    unsigned int size(unsigned int i) { return dsize[i]; } 


    MArray(const VUI& a){ 


     stot = 1; 
     for (unsigned int i = 0; i<a.size(); i++){ 

      if (a[i] == 0) { 
       Invalid_MDArray o; 
       throw o; 
      } 

      stot = stot*a[i]; 

      dsize.push_back(a[i]); 
      cumsize.push_back(stot); 
     } 

     dsize.push_back(stot); 

     p = new T[stot]; 


    } 


    ~MArray(){ 

     delete[] p; 
    } 


    inline T& operator()(VUI&& a){ 

     if (a.size() != dsize.size() - 1) { 

      out_of_range o("Index is out of bound!"); 
      throw o; 

     } 

     unsigned int i = 0; 
     while (i<a.size()){ 
      if (a[i]>dsize[i] - 1) { 

       out_of_range o("Index is out of bound!"); 
       throw o; 
      } 
      i++; 
     } 

     unsigned int index = 0; 

     //  index=i+imax*j+imax*jmax*k 

     i = 0; 
     while (i<a.size()){ 

      if (i == 0) { 
       index = a[i]; 
      } 
      else { 
       index = index + a[i] * cumsize[i - 1]; 

      } 


      i++; 
     } 


     return p[index]; 
    } 

}; 


int main(){ 


    try{ 
     MArray<int> t({ 2, 2, 2 }); 
     t({ 1, 1, 1 }) = 10; 
     cout << t({ 1, 1, 1 }) << endl; 

     // I prefer accessing the elements like this -> cout<<t(1,1,1)<<endl; 

     MArray<int> tt({ 2, 0, 2 }); // OOPS! cannot construct this array! 
     cout << t.size()<<endl; 
     t({ 1, 2, 1 }) = 1000; //OOPS! outofbound exception! 
    } 
    catch (exception &e){ 
     cout << e.what() << endl; 
    } 

    getchar(); 
} 

不過,我不喜歡的界面來訪問陣列,例如

cout << t({ 1, 1, 1 }) << endl; 

長相醜陋。

是否有可能實現這個不同有更自然的方式,以更好地元素訪問,像cout<<t(1,1,1);,而不是?

回答

0

我不會推倒重來。快速谷歌搜索顯示Boost.MultiArray,這是一個多維數組庫,它似乎符合您的所有設計要求。

我還要問,如果這是過早的優化。你真的需要這裏的速度?向量非常快。

+1

運算符()不是一個解決方案,因爲你必須定義一個維度的每個號碼,和多維數組的整點是,用戶可以在運行時指定尺寸的自定義數字。 – KjMag

+0

@KjMag你是對的。我從我的答案中刪除了這個。 –