2012-10-28 57 views
11

Giả sử tôi muốn khai báo vectơ của vectơ của vectơ của ... (tối đa n chiều).vector n-chiều

Giống như vậy:

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; 

Có cách nào để đi về việc này cho một n tùy ý với mẫu Lập trình meta?

+1

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

Trả lời

17

Có, và nó khá đơn giản.

Giống như bằng chứng bằng cảm ứng, chúng tôi thiết lập một trường hợp đệ quy và một trường hợp cơ bản (một phần chuyên biệt) kết thúc đệ quy.

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

tôi sẽ đề nghị sử dụng các thông số mẫu variadic thay vì chỉ một 'T' để cho phép truyền các thứ khác tới' std :: vector' (nó lấy các đối số mặc định bổ sung). – bitmask

+0

@bitmask: Không có lý do cho các đối số variadic, chỉ cần một đối số kiểu cho Allocator, nên được cung cấp mặc định giống như 'std :: vector'. Nhưng trong trường hợp hiếm hoi, một người cấp phát không chuẩn sẽ được sử dụng, nó có thể sẽ áp dụng cho tất cả việc sử dụng lớp này, trong trường hợp này nó chỉ có thể được đưa vào dòng typedef đệ quy. –

+0

Có, nhưng bạn sẽ phải chỉ định thủ công, đúng không? Có vẻ như rất nhiều rắc rối. – bitmask