2014-08-31 7 views
1

надеюсь, что вы можете мне помочь.Array in Array in C++

Скажем, у меня есть два матричных массива:

int n1[3][3]={{2,7,3},{1,8,7},{5,6,2}}; 
int n2[3][3]={{4,5,8},{5,5,6},{2,6,2}}; 

Тогда я могу назвать один из них с помощью

cout << n1[0][0] << endl; 

который вернет 2, конечно, но я хочу, чтобы получить что-то вроде

cout << n[1][0][0] << endl; // Returns 2 
cout << n[2][0][0] << endl; // Returns 4 

Можете ли вы сообщить мне, как я могу это сделать?

+0

Вы уже использовали 2D массив, то почему бы вам не использовать 3D массив? – ikh

+0

Я не знал, что что-то подобное существует. Не все имеют многолетний опыт программирования и документации для C++, очень трудно понять. Также, как сказал Наваз, необработанные массивы - не лучшее решение. Я использовал std :: array в моем коде. – Matt

+0

Да. В C++ 11 'std :: array' лучше, чем необработанный массив, за исключением короткого кода. Однако, если вы решите использовать это, я рекомендую вам изменить все необработанные массивы в вашем коде на 'std :: array' для согласованности. – ikh

ответ

10

Определение n как:

int n[2][3][3]= { 
       {{2,7,3},{1,8,7},{5,6,2}}, 
       {{4,5,8},{5,5,6},{2,6,2}} 
       }; 

Обратите внимание, что сырые массивы в C++ не достаточно хорошо. Лучше использовать std::array:

std::array<std::array<std::array<int,3>,3>, 2> n = { 
       {{2,7,3},{1,8,7},{5,6,2}}, 
       {{4,5,8},{5,5,6},{2,6,2}} 
       }; 

Ну, это выглядит некрасиво — использование ЬурейеЕ (или псевдоним) для упрощения синтаксиса:

template<typename T, std::size_t M, std::size_t N, std::size_t P> 
using array3d = std::array<std::array<std::array<T,P>,N>, M>; 

Затем используйте его как:

array3d<int,2,3,3> n = { 
          {{2,7,3},{1,8,7},{5,6,2}}, 
          {{4,5,8},{5,5,6},{2,6,2}} 
         }; 

То лучше.


Вы можете обобщать псевдоним как:

#include <array> 

template<typename T, std::size_t D, std::size_t ... Ds> 
struct make_multi_array 
    : make_multi_array<typename make_multi_array<T,Ds...>::type, D> {}; 

template<typename T, std::size_t D> 
struct make_multi_array<T,D> { using type = std::array<T, D>; }; 

template<typename T, std::size_t D, std::size_t ... Ds> 
using multi_array = typename make_multi_array<T,D,Ds...>::type; 

Затем использовать его в качестве (прочитать комментарии для лучшего понимания):

//same as std::array<int,10> 
//similar to int x[10] 
multi_array<int,10> x; 

//same as std::array<std::array<int,20>,10> 
//similar to int y[10][20] 
multi_array<int,10,20> y; 

//same as std::array<std::array<std::array<int,30>,20>,10> 
//similar to int z[10][20][30] 
multi_array<int,10,20,30> z; 

Надежда, что помогает.

+1

+1 для мульти-массива. Это то, чего я всегда хочу. – ikh

1

Затем вам нужно создать трехмерный массив и получить доступ ко второй строке, первой колонке и первой колонке глубины.

1
int foo[x][y][z] = {}; 

Это делает многомерный массив размера х * у * г со всеми элементами инициализируется 0.