Как инициализировать 3D-массив в C ++ - PullRequest
33 голосов
/ 01 февраля 2010

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

int min[1][1][1] = {100, { 100, {100}}}; //this is not the way

Ответы [ 4 ]

61 голосов
/ 01 февраля 2010

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

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 чисел.

9 голосов
/ 01 февраля 2010

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

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 динамически распределяет хранилище, и это хорошо, потому что пространство стека часто очень ограничено, а трехмерные массивы легко занимают много места. Обтекание его таким классом также делает передачу массива (путем копирования или по ссылке) другим функциям тривиальной, а выполнение любой передачи многомерных статических массивов очень проблематично.

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

7 голосов
/ 19 октября 2010

Вот еще один способ динамического выделения трехмерного массива в C ++.

int dimX = 100; int dimY = 100; int dimZ = 100;
int*** array;    // 3D array definition;
// begin memory allocation
array = new int**[dimX];
for(int x = 0; x < dimX; ++x) {
    array[x] = new int*[dimY];
    for(int y = 0; y < dimY; ++y) {
        array[x][y] = new int[dimZ];
        for(int z = 0; z < dimZ; ++z) { // initialize the values to whatever you want the default to be
            array[x][y][z] = 0;
        }
    }
}
3 голосов
/ 02 февраля 2010

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

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

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

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