设置动态数组的默认值

pea*_*ach 5 c++ arrays dynamic

此代码将创建一个包含100个元素的数组,并将每个元素的值设置为false.

bool boolArray[100] = false;
Run Code Online (Sandbox Code Playgroud)

如何设置动态数组的默认值?

void Foo(int size)
{
    bool boolArray = new bool[size];
    //Now what?
}
Run Code Online (Sandbox Code Playgroud)

Meh*_*ari 11

使用std::fill功能std::fill_n功能.

std::fill_n(boolArray, length, defaultValue);
std::fill(boolArray, boolArray + length, defaultValue);
Run Code Online (Sandbox Code Playgroud)

旁注:尝试使用std::vector.


Che*_*Alf 11

在标准C++中,您可以默认初始化任何内容,包括该数组:

bool* boolArray = new bool[size]();     // Zero-initialized
Run Code Online (Sandbox Code Playgroud)

完成程序,也检查结果,并释放数组:

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;
}
Run Code Online (Sandbox Code Playgroud)

你的编译器是否会接受甚至做正确的事情是另一回事.

所以,在实践中,如果你觉得使用原始数组的不可抗拒的冲动,那么也许更好地使用std::fill或者某些这样的,甚至是原始循环.

但请注意重复delete[]表达.这样的冗余代码很容易出错:它是Evil™.使用原始数组还有很多其他问题,所以作为一个新手,只需对原始数组和原始指针等等.

相反,使用标准库容器,正确地为您管理分配,初始化,复制和释放.但是,这有一点问题,即过早优化std::vector<bool>,否则将是自然的选择.本质上std::vector<bool>每个值只使用一位,因此它不能分发对bool元素的引用,而是分发代理对象......

因此,对于bool元素,使用例如a std::bitset(当编译时已知大小时)或例如a 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;
}
Run Code Online (Sandbox Code Playgroud)

干杯&hth.,