0

是否有可能讓一個成員是一個多維數組,其維度和範圍在運行時才知道?使用嵌套的std :: array創建一個多維數組,直到運行時才知道維度或範圍

我發現(通過this guide)的方式來創建一個結構來容易築巢的std ::使用模板元編程在編譯時數組:

#include <array> 
/* 
this struct allows for the creation of an n-dimensional array type 
*/ 
template <typename T,size_t CurrentDimExtent,size_t... NextDimExtent> 
struct MultiDimArray{ 
public: 
//define the type name nestedType to be a recursive template definition. 
    using nestedType=typename MultiDimArray<T,NextDimExtent...>::type; 
    using type=std::array<nestedType,CurrentDimExtent>; 
}; 
/* 
This struct is the template specialization which handles the base case of the 
final dimensional extent 
*/ 
template <typename T,size_t DimExtent> 
struct MultiDimArray<T,DimExtent>{ 
    using type=std::array<T,DimExtent>; 
}; 

這仍然未能在兩個方面滿足我的要求的(我知道的):

  1. 爲了聲明這種類型的變量(或指向變量的指針),你必須聲明尺寸。
  2. 只有當DimExtents是常量表達式(在編譯時設置)時纔有效。

爲了證明爲什麼數2是一個獨特的問題,這裏是用(2)一個void *尺寸的一組數來引用多維數組的類:

template <typename T> 
class TwoDimGrid{ 
public: 
TwoDimGrid(const size_t extent1,const size_t extent2): 
_twoDimArray(new MultiDimArray<T,extent1,extent2>); 
private: 
void* _twoDimArray; 
}; 

這不會編譯因爲extent1和extent2不是常量表達式。其他

筆記:

  • 我想看看是否有可能使用std來完成:陣列,而不是天然的陣列或類似的std ::向量動態調整容器。
  • 請在適當的地方使用智能指針(我沒有,因爲我真的不知道如何處理智能無效指針)。

編輯

我已經陷入了The XY Problem X是這個問題的第一句話和Y是如何使用的std ::陣列完成它的陷阱。因此,我創建了一個new question,並且在這裏可以解決Y問題。

+0

的std ::陣列需要知道它在編譯時的大小,你不能把它演繹它在運行時,使用std: :vector – dchhetri

+0

@ user814628即使使用std :: vector,我仍然會遇到在編譯時必須知道維數的問題。 –

+1

你可以使用boost :: multi_array嗎? – dchhetri

回答

0

老同學多維數組,沿着這些路線的東西:

template <typename T> 
class multi 
{ 
    T*myArray; 
    size_t x_dim; 
    size_t y_dim; 
public: 
    multi(size_t x, size t y) : x_dim(x), y_dim(y) 
    { 
     myArray = new T[x*y]; 
    } 

    T& get(int x, int y) 
    { 
     return myArray[x*y_dim+y]; 
    } 
}; 
+0

此代碼不會創建多維數組,但會模仿2D陣列。多維數組需要一個未定義數量的參數:T&get(x1,x2,x3,.....,xN)。 – lucas92

0
template <typename T> 
class vvc 
{ 
    //possible ragged array ..non rigorous approach 
    //with management memory cost per element 
    //clearly not as efficient as .... linearized access where access index is 
    //row size * r + column 
    //memory management courtesy of vector 
    public: 
    std::vector< std::vector<T> > v; 
}; 

int double_vector() 
{ 
    int x1 = 5; 
    int x2 = 3; 
    std::vector<int> r(x2); 
    vvc<int> vv; 
    int k = 0; 
    for (int i1 = 0; i1 < x1; ++i1) 
    { 
     for (int i2 = 0; i2 < x2; ++i2) 
     { 
      k += 1; 
      r[i2] = k; 
     } 
     vv.v.push_back(r); 

    } 
    //inspect 
    cout << vv.v[0][0] << " first " << endl; 
    for (auto const & t1 : vv.v) 
    { 
     for (auto const &t2 : t1) 
     { 
      cout << t2 << " "; 
     } 
     cout << endl; 
    } 
    return 0; 
} 
+0

這隻適用於二維,而不是N維。 –