Установить значение по умолчанию для динамического массива - PullRequest
5 голосов
/ 24 ноября 2010

Этот код создаст массив из 100 элементов и установит для каждого значение false.

bool boolArray[100] = false;

Как установить значение по умолчанию для динамического массива?

void Foo(int size)
{
    bool boolArray = new bool[size];
    //Now what?
}

Ответы [ 4 ]

11 голосов
/ 24 ноября 2010

Используйте std::fill функцию или std::fill_n функцию .

std::fill_n(boolArray, length, defaultValue);
std::fill(boolArray, boolArray + length, defaultValue);

Примечание: попробуйте вместо этого использовать std::vector.

11 голосов
/ 24 ноября 2010

В стандартном C ++ вы можете по умолчанию инициализировать практически все, включая этот массив:

bool* boolArray = new bool[size]();     // Zero-initialized

Полная программа, которая также проверяет результат и освобождает массив:

bool foo( int size )
{
    bool* boolArray = new bool[size]();     // Zero-initialized

    // Check that it is indeed zero-initialized:   
    for( int i = 0; i < size; ++i )
    {
        if( boolArray[i] ) { delete[] boolArray; return false; }
    }
    delete[] boolArray; return true;
}

#include <iostream>
int main()
{
    using namespace std;
    cout << (foo( 42 )? "OK" : "Ungood compiler") << endl;
}

Примет ли ваш компилятор правильную вещь или даже сделает это совсем другое дело.

Итак, на практике если вы испытываете непреодолимое желание использовать необработанный массив, тогда, возможно, лучше использовать std::fill или что-то подобное, или даже необработанный цикл.

Но обратите внимание на повторяющиеся delete[] -выражения.Такой избыточный код очень легко ошибиться: это Evil ™.И еще много чего может пойти не так с использованием необработанных массивов, так что для новичка просто скажите No ™ необработанным массивам, указателям и т. Д.

Вместо этого используйте стандартные библиотечные контейнеры, которые управляют распределением, инициализациейКопирование и освобождение для вас - правильно.Однако есть небольшая проблема, а именно преждевременная оптимизация в std::vector<bool>, которая в противном случае была бы естественным выбором.По сути, std::vector<bool> использует только один бит на значение, поэтому он не может раздавать ссылки на элементы bool, а вместо этого раздает прокси-объекты ...

Так, для элементов bool используйте, например, astd::bitset (когда размер известен во время компиляции) или, например, std::deque, как указано ниже:

#include <deque>

bool foo( int size )
{
    std::deque<bool> boolArray( size );     // Zero-initialized

    for( int i = 0; i < size; ++i )
    {
        if( boolArray[i] ) { return false; }
    }
    return true;
}

#include <iostream>
int main()
{
    using namespace std;
    cout << (foo( 42 )? "OK" : "Ungood compiler") << endl;
}

Cheers & hth.,

2 голосов
/ 24 ноября 2010
bool* boolArray = new bool[size];
for(int i = 0; i < size; i++) {
    boolArray[i] = false;
}
0 голосов
/ 24 ноября 2010

А как же:

void Foo(int size)
{
    // bool boolArray = new bool[size];
    // Did you mean bool*?
    // Try and avoid direct allocation of memory.
    // Memory allocation should be done inside an object that 
    // actively manages it.

    // Normally I would recommend a vector
    std::vector<bool>   boolArray(size, false);

    // But. And a Big but. Is that the standards committee decided to
    // specialize the vector for bool so that each element only takes
    // a single bit. Unfortunately this had some side effects that were
    // made its use not perfect (time/assign-ability).

    // So we can try a boost array
    boost::array<bool, size>   boolArray;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...