Как создавать массивы с неограниченной вложенностью в c++?

В языке программирования C++ массивы являются статическими структурами данных, то есть их размер должен быть определен на этапе компиляции и не может изменяться во время выполнения программы. Поэтому непосредственно встроенной поддержки создания массивов с неограниченной вложенностью в языке нет. Однако, можно использовать указатели и динамическое выделение памяти для создания иерархических структур данных, которые позволят создавать массивы с возможностью различных уровней вложенности.

Один из подходов заключается в использовании указателей на указатели для создания многомерных массивов. Например, для создания двумерного массива можно использовать следующий код:

int main() {
    const int rows = 3;  // количество строк
    const int cols = 4;  // количество столбцов
    
    int** matrix = new int*[rows];  // выделение памяти для указателей на строки
    for (int i = 0; i < rows; i++) {
        matrix[i] = new int[cols];  // выделение памяти для каждой строки
    }
    
    // инициализация элементов массива
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            matrix[i][j] = i + j;
        }
    }
    
    // вывод элементов массива
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            std::cout << matrix[i][j] << " ";
        }
        std::cout << std::endl;
    }
    
    // освобождение памяти
    for (int i = 0; i < rows; i++) {
        delete[] matrix[i];
    }
    delete[] matrix;
    
    return 0;
}

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

Более гибким и рекомендуемым способом создания массивов с неограниченной вложенностью в C++ является использование контейнеров класса std::vector. Векторы позволяют динамически выделять и освобождать память, а также предоставляют удобный интерфейс для работы с элементами массива. Вот пример кода, демонстрирующего создание трехмерного массива с использованием векторов:

#include <iostream>
#include <vector>

int main() {
    const int layers = 2;   // количество слоев
    const int rows = 3;     // количество строк в каждом слое
    const int cols = 4;     // количество столбцов в каждом слое
    
    // создание трехмерного массива с помощью векторов
    std::vector<std::vector<std::vector<int>>> array(layers, std::vector<std::vector<int>>(rows, std::vector<int>(cols)));
    
    // инициализация элементов массива
    for (int i = 0; i < layers; i++) {
        for (int j = 0; j < rows; j++) {
            for (int k = 0; k < cols; k++) {
                array[i][j][k] = i + j + k;
            }
        }
    }
    
    // вывод элементов массива
    for (int i = 0; i < layers; i++) {
        for (int j = 0; j < rows; j++) {
            for (int k = 0; k < cols; k++) {
                std::cout << array[i][j][k] << " ";
            }
            std::cout << std::endl;
        }
        std::cout << std::endl;
    }
    
    return 0;
}

Мы создаем трехмерный массив, который представляет собой вектор векторов векторов типа int. Конструктор std::vector позволяет задать размеры для каждого измерения. Затем мы инициализируем элементы массива и выводим их на экран.

Использование контейнеров std::vector обычно предпочтительнее, так как они предоставляют более гибкий и надежный механизм для работы с динамическими массивами любой вложенности.