Как инициализировать 3D массив в C++

Как Вы инициализируете 3-й массив в C++

int min[1][1][1] = {100, { 100, {100}}}; //this is not the way
35
задан Carl Norum 2 February 2010 в 01:15
поделиться

3 ответа

Массив в вашем вопросе имеет только один элемент, поэтому вам нужно только одно значение, чтобы полностью инициализировать его. Вам нужны три набора брекетов, по одному для каждого измерения массива.

int min[1][1][1] = {{{100}}};

Очередной пример может быть:

int arr[2][3][4] = { { {1, 2, 3, 4}, {1, 2, 3, 4}, {1, 2, 3, 4} },
                     { {1, 2, 3, 4}, {1, 2, 3, 4}, {1, 2, 3, 4} } };

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

64
ответ дан 27 November 2019 в 06:45
поделиться

Кажется, все забывают STD :: ValArray . Это шаблон STL для плоских многомерных массивов, а также индексирование и нарезка их.

http://www.cplusplus.com/reference/std/valarray/

Нет статической инициализации, но это действительно важно?

3
ответ дан 27 November 2019 в 06:45
поделиться

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

class Array3D {
    size_t m_width, m_height;
    std::vector<int> m_data;
  public:
    Array3D(size_t x, size_t y, size_t z, int init = 0):
      m_width(x), m_height(y), m_data(x*y*z, init)
    {}
    int& operator()(size_t x, size_t y, size_t z) {
        return m_data.at(x + y * m_width + z * m_width * m_height);
    }
};

// Usage:
Array3D arr(10, 15, 20, 100); // 10x15x20 array initialized with value 100
arr(8, 12, 17) = 3;

std :: vector распределяет память динамически, что хорошо, потому что пространство стека часто очень ограничено, а трехмерные массивы легко используют много места. Обертывание его в подобный класс также делает передачу массива (копированием или ссылкой) другим функциям тривиальной задачей, в то время как любая передача многомерных статических массивов очень проблематична.

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

9
ответ дан 27 November 2019 в 06:45
поделиться