Набор многомерных массивов - это то же самое, что и многомерный массив с еще одним измерением.
Кроме того, несколько вещей о встроенных массивах:
- В C ++ размеры встроенного массива должны основываться на постоянной времени компиляции.Вы не можете рассчитать размер, прочитать его из файла, получить его из пользовательского ввода и т. Д.
- Чтобы создать встроенный массив с переменным размером, вы должны выделить память и использовать ее как указатель
- Чтобы распределение встроенного массива было переносимым между C и C ++, вы должны использовать
malloc
и убедиться, что позже вы вызовете free
для всего, что вы получили от malloc
(что иногда можеточень трудно понять правильно)
Если вы используете C ++ и вам не нужно компилировать код с помощью компилятора C, я рекомендую использовать vector
вместо встроенного массива,Векторы не обязательно должны иметь постоянный размер, и их можно изменять каждый раз, когда вы захотите изменить их размер, часто без вызова malloc
или new
в вашем коде
Один из способов сделать это будет выглядеть следующим образом:
#include<iostream>
#include<vector>
int main(int argc, char* argv[])
{
std::cout << "Enter the number of arrays you want:" << std::endl;
const int size = 4;
const int initial_value = 0;
int i;
std::cin >> i;
std::vector<int> sub_sub_array(size, initial_value);
std::vector<std::vector<int> > sub_array(size, sub_sub_array);
std::vector<std::vector<std::vector<int> > > array(i, sub_array);
array[0][1][2] = 5;
// Print out the full array contents
for(size_t i = 0; i < array.size(); ++i)
{
for(size_t j = 0; j < size; ++j)
{
for(size_t k = 0; k < size; ++k)
{
std::cout << "(" << j << ", " << k << ") - " << array[i][j][k] << ", ";
}
std::cout << "\n";
}
std::cout << "\n";
}
}
Введите необходимое количество массивов:
2
(0, 0) - 0, (0, 1) - 0, (0,2) - 0, (0, 3) - 0,
(1, 0) - 0, (1, 1) - 0, (1, 2) - 5 , (1, 3) - 0,
(2, 0) - 0, (2, 1) - 0, (2, 2) - 0, (2, 3) - 0,
(3, 0) - 0,(3, 1) - 0, (3, 2) - 0, (3, 3) - 0,
(0, 0) - 0, (0, 1) - 0, (0, 2) - 0, (0, 3) - 0,
(1, 0) - 0, (1, 1) - 0, (1, 2) - 0, (1, 3) - 0,
(2, 0) - 0, (2, 1) - 0, (2, 2) - 0, (2, 3) - 0,
(3, 0) - 0, (3, 1) - 0, (3, 2) - 0, (3, 3) - 0,
Редактировать:
Единственная проблема с вышеуказанным решением состоит в том, что выможет или не сможет использовать его в коде, который ожидает встроенный массив.Судя по вашим комментариям, вам это нужно.
Если ваш существующий код может принимать по одной строке за раз, то вышеуказанное решение будет работать.Если он может принимать только 2d массив, вам придется использовать другую векторную структуру.См. Этот вопрос, почему:
Передать вложенный вектор C ++ как многомерный массив встроенного стиля
Если вам нужен набор смежных 2d-массивов, вот некоторыепараметры:
std::vector<int*> array_instances(i);
for(size_t j = 0; j < array_instances.size(): ++j)
array_instances[j] = new int[size * size];
for(size_t j = 0; j < array_instances.size(); ++j)
existing_code(array_instances[j]);
// When done with the arrays
for(size_t j = 0; j < array_instances.size(): ++j)
delete[] array_instances[j]; // Make sure to include the brackets after "delete"
или:
std::vector<int> template_array(size * size, 0);
std::vector<std::vector<int> > array_instances(i, template_array);
for(size_t j = 0; j < array_instances.size(); ++j)
existing_code(&array_instances[j][0]);