2D литералы массива в C ++ - PullRequest
       1

2D литералы массива в C ++

7 голосов
/ 09 февраля 2012

Я пытаюсь построить двумерный массив в виде указателей на указатели.Это не работает:

bool** data =  {
    new bool[4] {true, true, true, true},
    new bool[4] {true, false, false, true},
    new bool[4] {true, false, false, true},
    new bool[4] {true, true, true, true}
};

Возможно ли это?Как я должен это делать?


РЕДАКТИРОВАТЬ:

Похоже, я мог пытаться сделать не то, что нужно.У меня есть функция, которая принимает в качестве аргументов двумерный массив bool s неизвестного размера, а также целочисленную ширину и высоту.В настоящее время подпись:

 foo(bool** data, int width, int height)

Я хочу иметь возможность создавать литерал для данных, но мне также нужна эта функция для работы с массивами любого размера.

Ответы [ 3 ]

14 голосов
/ 09 февраля 2012

Вы можете иметь массив массивов (иногда их называют многомерным массивом):

bool data[][4] =  {
    {true, true, true, true},
    {true, false, false, true},
    {true, false, false, true},
    {true, true, true, true}
};

Однако, это не конвертируется в bool**, поэтому, если вам нужно это преобразование, то это не сработает.

В качестве альтернативы, массив указателей на статические массивы (который является конвертируемым в bool**):

bool data0 = {true, true, true, true};
bool data1 = {true, false, false, true};
bool data2 = {true, false, false, true};
bool data3 = {true, true, true, true};
bool * data[] = {data0, data1, data2, data3};

или если вам действительно нужны динамические массивы (что почти наверняка является плохой идеей):

bool * make_array(bool a, bool b, bool c, bool d) {
    bool * array = new bool[4];
    array[0] = a;
    array[1] = b;
    array[2] = c;
    array[3] = d;
    return array;
}

bool * data[] = {
    make_array(true, true, true, true),
    make_array(true, false, false, true),
    make_array(true, false, false, true),
    make_array(true, true, true, true)
};

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

template <size_t N, size_t M>
void do_something(bool (&array)[N][M]);

do_something(data);
4 голосов
/ 09 февраля 2012
bool data_[][4] =  {
     {true, true, true, true},
     {true, false, false, true},
     {true, false, false, true},
     {true, true, true, true}
};
bool *data[4] = { data_[0], data_[1], data_[2], data_[3] };
1 голос
/ 18 октября 2013
bool *data[] =  {
    (bool []){true, true, true, true}
     ,(bool[]) {true, false, false, true}
     ,(bool[]) {true, false, false, true}
     ,(bool[]) {true, true, true, true}
};

Это конвертируется в bool**, как вы хотите. Это не массив массивов. Это массив указателей.

Предварительно добавив в каждую строку (bool []), мы включаем ее в указатель. Поэтому каждая строка является указателем и может быть затем объединена в массив из четырех указателей.

Редактировать: Вы можете опустить явный 4 внутри [ фигурных скобок ], как это может быть выведено компилятором.

...