Как реализовать массив, который содержит двумерные(многомерные) массивы??
Если так вообще можно.
Пишу в .Net
Поконкретнее можно?
Что значит "реализовать"? Можно пользоваться встроенными массивами:
int a[10][20][30] = {};
такое не подходит? если нет, то что надо точно?
Здравствуйте, Roman__, Вы писали:
R__>Как реализовать массив, который содержит двумерные(многомерные) массивы??
R__>Если так вообще можно.
R__>Пишу в .Net
Если нужен именно тип "многомерный массив", то можно вот так:
typedef int P_arr[3][4]; //определили тип "двухмерный массив"
P_arr arr[2] = {{{01,01,01,01},{02,02,02,02},{03,03,03,03}},{{11,11,11,11},{12,12,12,12},{13,13,13,13}}};
//создали массив из двух двумерных массивов и проинициализировали
//доступ - как к членам обычного трёхмерного массива
for(int i = 0; i < 2; i++) {
for(int j = 0; j < 3; j++) {
for(int k = 0; k < 4; k++) {
cout << arr[i][j][k] << ' ';
}
cout << endl;
}
cout << endl;
}
cout << endl;
То же самое можно сделать через массив указателей на многомерные массивы:
typedef int (*P_arr) [3][4]; //определили тип "указатель на двухмерный массив"
P_arr arr[2]; //создали массив указателей на двухмерные массивы
int array1[3][4] = {{1,1,1,1},{2,2,2,2},{3,3,3,3}};
int array2[3][4] = {{11,11,11,11},{12,12,12,12},{13,13,13,13}};
arr[0] = &array1;
arr[1] = &array2;
//доступ выглядит немного по-дурацки - необходимо сначала разыменовать указатель на массив
for(int i = 0; i < 2; i++) {
for(int j = 0; j < 3; j++) {
for(int k = 0; k < 4; k++) {
cout << (*arr[i])[j][k] << ' ';
}
cout << endl;
}
cout << endl;
}
cout << endl;
Если массив должен быть заполнен массивами разных размеров (но одинаковых размерностей!!!) — например, {int[2][3], int[6][12], int[11][25]}, то лучше всего воспользоваться векторами векторов
vector<vector<vector<int> > > vec(2); //создали вектор из двухмерных векторов типа int
// заполняем вектора
vec.at(0).resize(2);
vec.at(1).resize(3);
vec.at(0).at(0).push_back(1);
vec.at(0).at(1).push_back(2);
vec.at(0).at(1).push_back(3);
vec.at(0).at(1).push_back(4);
vec.at(1).at(0).push_back(6);
vec.at(1).at(0).push_back(7);
vec.at(1).at(1).push_back(8);
vec.at(1).at(2).push_back(9);
vec.at(1).at(2).push_back(10);
vec.at(1).at(2).push_back(11);
vec.at(1).at(2).push_back(12);
//доступ к результатам - через функции size() и at(), хотя вместо последнего пойдёт и обычный оператор индексирования
for(int i = 0; i < vec.size(); i++) {
for(int j = 0; j < vec.at(i).size(); j++) {
for(int k = 0; k < vec.at(i).at(j).size(); k++) {
cout << vec.at(i).at(j).at(k) << ' ';
// или так: cout << vec[i].at(j)[k] << ' ';
// или так: cout << vec[i][j][k] << ' ';
}
cout << endl;
}
cout << endl;
}
cout << endl;
Получим вывод:
1
2 3 4
6 7
8
9 10 11 12
Здравствуйте, Roman__, Вы писали:
R__>Как реализовать массив, который содержит двумерные(многомерные) массивы??
R__>Если так вообще можно.
Конечно, можно — причём разнообразно.
Удобнее использовать не голые сишные массивы, а обёртку — boost::array или — если размеры переменные — то std::vector.
boost::array<boost::array<boost::array<ElemType, ZSize>, YSize>, XSize> xyz_array;
С вектором векторов — получается так называемый jagged array (массив с рваным краем), когда размеры каждого элемента не зависят друг от друга. Для того, чтобы сделать "кирпич", придётся приложить дополнительные усилия, либо взять линейный массив и транслировать координаты в линейный индекс.
R__>Пишу в .Net
Тебе нужен управляемый массив? Или ты имеешь в виду VS.net (она же VS2003, VC7)?
Здравствуйте, Roman__, Вы писали:
R__>Как реализовать массив, который содержит двумерные(многомерные) массивы??
R__>Если так вообще можно.
R__>Пишу в .Net
C#:
//creates an array of two-dimensional arrays of bytes
byte[][,] myArray = new byte[10][,];
for (int i = 0; i < myArray.Length; ++i)
{
myArray[i] = new byte[5, 3];
}