2012-10-28 23 views
11

Diyelim ki bir vektörün vektörünün bir vektörünü bildirmek istiyorum ... (n boyutuna kadar). böylece gibin boyutlu vektör

: şablonlarla bağıntılı keyfi bir n için bunu hakkında gitmek için bir yol

using namespace std; 
// for n=2 
vector<vector<int> > v2; 
// for n=3 
vector<vector<vector<int> > > v3; 
// for n=4 
vector<vector<vector<vector<int> > > > v3; 

var mı?

+1

[Boost.MultiArray] (http://www.boost.org/doc/libs/1_51_0/libs/multi_array/doc/index.html) –

cevap

17

Evet, ve oldukça basit.

İndüksiyon yoluyla bir kanıt gibi, özyinelemeyi ve özyinelemeyi sona eren (kısmen uzmanlaşmış) bir temel durum oluşturuyoruz.

template<size_t dimcount, typename T> 
struct multidimensional_vector 
{ 
    typedef std::vector< typename multidimensional_vector<dimcount-1, T>::type > type; 
}; 

template<typename T> 
struct multidimensional_vector<0,T> 
{ 
    typedef T type; 
}; 

multidimensional_vector<1, int>::type v; 
multidimensional_vector<2, int>::type v2; 
multidimensional_vector<3, int>::type v3; 
multidimensional_vector<4, int>::type v4; 
+0

Ben variadic şablon parametreleri kullanmak önermek yerine sadece ediyorum Diğerleri 'std :: vector' (diğer varsayılan argümanları alır) için izin vermek için bir 'T'. – bitmask

+0

@bitmask: Variadic argümanlar için bir neden yok, Allocator için sadece bir tip argüman, std :: vector'nun kendisi ile aynı varsayılan olarak verilmelidir. Ancak, nadir durumlarda standart olmayan bir ayırıcı istenirse, muhtemelen bu sınıfın tüm kullanımları için geçerli olacaktır, bu durumda sadece tekrarlayan yazım satırına konulabilir. –

+0

Evet, ancak bunu manuel olarak belirtmelisiniz, değil mi? Bir sürü bela gibi görünüyor. – bitmask

İlgili konular