Динамический массив bool в C ++ - PullRequest
0 голосов
/ 14 апреля 2011
// All right? This is really good working code? 
//Need init array with value "false"

bool **Madj;
int NodeCount=4;

bool **Madj = new bool*[NodeCount];
for (int i=0; i<NodeCount; i++){
    Madj[i] = new bool [NodeCount];
    for (int j=0; j<NodeCount; j++){
        Madj[i][j] = false;
    }
}

Ответы [ 6 ]

4 голосов
/ 14 апреля 2011

Можно рассмотреть использование встроенного многомерного массива Boost в качестве менее хрупкой альтернативы. Как отмечалось, код, который вы предоставили, будет работать, но у него есть проблемы.

3 голосов
/ 14 апреля 2011

А как же:

std::vector<std::vector<bool> >   Madj(4,std:vector<bool>(4, false));

К сожалению, std :: vector специализируется для оптимизации по размеру (не по скорости).
Так что это может быть неэффективно (особенно, если используется много). Таким образом, вы можете использовать массив int (если вы обнаружите, что версия bool замедляет работу).

std::vector<std::vector<int> >   Madj(4,std:vector<int>(4, 0));

Примечание: int может использоваться в логическом контексте и автоматически преобразовываться (0 => false, любое другое число - true (хотя лучше использовать 1).

3 голосов
/ 14 апреля 2011

По крайней мере, IMO, если вы настаиваете на том, чтобы делать это вообще, вы обычно должны делать это по-другому, что-то вроде:

class bool_array { 
     bool *data_;
     size_t width_;

     // no assignment or copying
     bool_array &operator=();
     bool_array(bool_array const &);
public:
     bool_array(size_t x, size_t y) width_(x) {
         data_ = new bool[x*y];
         std::fill_n(data_, x*y, false);
     }

     bool &operator()(size_t x, size_t y) { 
         return data_[y+width_+x];
     }

     ~bool_array() { delete [] data_; }
};

Это может быть приукрашено (например, использование прокси для обеспечения константности), но общая идея остается: 1) выделить ваши bool s в одном блоке, и 2) поместить их в класс, и 3) перегрузить оператор для поддержки достаточно чистого индексирования данных.

Вам также следует рассмотреть возможность использования std::vector<bool>. В отличие от других экземпляров std::vector, это не контейнер (как стандарт определяет этот термин), что может сбивать с толку - но то, что вы создаете, также не является контейнером, так что, очевидно, для вас это не имеет значения.

1 голос
/ 14 апреля 2011
bool **Madj = new bool*[NodeCount];
for (int i=0; i<NodeCount; i++){
    Madj[i] = new bool [NodeCount];
    for (int j=0; j<NodeCount; j++){
        Madj[i][j] = false;
    }
}

Если первый вызов new завершается успешно, но любой из циклов не выполняется, происходит утечка памяти, поскольку Madj и подмассивы до текущего i не удаляются. Используйте vector<vector<bool> > или vector<bool> размера NodeCount * NodeCount. С последним вариантом вы можете получить элемент (i, j) с помощью [i*NodeCount+j].

0 голосов
/ 14 апреля 2011

Если у вас есть только bool с, рассмотрите возможность использования bitset с. Вы можете комбинировать это с другими контейнерами для многомерных массивов, например, vector<bitset>.

0 голосов
/ 14 апреля 2011

Я думаю, что это выглядит хорошо!

В зависимости от использования вы можете использовать std :: vector вместо необработанного массива.

Но верно, что первое объявление Madj должно быть "внешним", чтобы избежать ошибок линковки или дублирования.

...