Можно ли создать трехмерный массив с отрицательными числами в C ++ - PullRequest
0 голосов
/ 25 апреля 2020

эй, у меня сейчас есть 3D-массив объектов, но я хочу сделать так, чтобы половина индексов была отрицательной. Я почти уверен, что видел кое-что о том, как отрицательные массивы могут вызывать ошибки и сбои, это правда? Вот код, который я имею для создания своего массива, если это поможет каким-либо образом.

    //creates 3 dimensional array
 vGrid = new Vox * *[arraySize];
for (int x = 0; x < arraySize; x++)
{

    vGrid[x] = new Vox * [arraySize];

    for (int y = 0; y < arraySize; y++)
    {

        vGrid[x][y] = new Vox[arraySize];
    }

}

любая помощь будет принята с благодарностью, спасибо!

1 Ответ

0 голосов
/ 25 апреля 2020

ОК, значит, вам нужно трехмерное декартово пространство с положительными и отрицательными координатами. Вы можете написать класс для реализации этого:

class Space {
public:
    Space(int len) : _vox(len*len*len), _len(len) {}
    Vox& operator()(int x, int y, int z);
private:
    std::vector<Vox> _vox;
    int _len;
};

Это создает объекты len ^ 3 Vox, но в одном векторе, который безопаснее и эффективнее, чем массив указателей в стиле C в стиле указателей.

operator() - это функция индексации, которую можно использовать следующим образом:

Space space(51); // 3D: 51x51x51, valid indexes [-25..25]
Vox& vox = space(10, -5, 0);
// ... do things with the Vox at those coordinates

Я использую () вместо [], поскольку operator[] может принимать только один аргумент и мы бы предпочли три аргумента для более естественной трехмерной индексации. Реализуйте оператор индексирования следующим образом:

Vox& Space::operator()(int x, int y, int z)
{
    // shift the "natural" input coordinates into "storage" coordinates
    x += _len / 2; // 10 becomes 35
    y += _len / 2; // -5 becomes 20
    z += _len / 2; // 0 becomes 25
    return _vox.at(x + y*_len + z*_len*_len); // index linear storage as 3D
}

Я использовал at() вместо [], потому что он проверяет диапазон и выдает исключение, если вы превышаете диапазон.

...