【问题标题】:Set default value of dynamic array设置动态数组的默认值
【发布时间】:2011-05-14 20:34:29
【问题描述】:

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

bool boolArray[100] = false;

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

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

【问题讨论】:

  • 它是bool *boolArray,而不是bool boolArray(这只是一个布尔值,所以new something 的分配甚至没有意义)。
  • 第一行应该是... = {false};

标签: c++ arrays dynamic


【解决方案1】:

在标准 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™。使用原始数组还有很多其他问题,因此作为新手,只需对原始数组和原始指针等说不。

相反,请使用标准库容器,它们会为您管理分配、初始化、复制和释放 - 正确。不过,这有一个小问题,即std::vector&lt;bool&gt; 中的过早优化,否则这将是自然的选择。本质上,std::vector&lt;bool&gt; 每个值只使用一位,因此它不能分发对 bool 元素的引用,而是分发代理对象……

因此,对于 bool 元素,请使用例如std::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;
}

干杯,

【讨论】:

    【解决方案2】:

    使用std::fill functionstd::fill_n function

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

    旁注:尝试改用std::vector

    【讨论】:

    • 使用std::vector 有一些问题;看我的回答。此外,虽然使用 std::fill 肯定是对 OP 问题的概括的一个很好的解决方案,但对于手头的特定问题并不是必需的。再次,请参阅我的答案。干杯&hth.,
    【解决方案3】:
    bool* boolArray = new bool[size];
    for(int i = 0; i < size; i++) {
        boolArray[i] = false;
    }
    

    【讨论】:

    • +1:不像 Mehrdad 的 std::fill 建议(也是 +1-ed)那样“优雅”,但它是如此基本且可重复使用,这是在不确定时使用的一种很好的、​​高效的方法。
    【解决方案4】:

    怎么样:

    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;
    }
    

    【讨论】:

    • 嗯,只是一点,你不能使用运行时size 作为模板参数(就像我写这篇文章的代码一样)。也许 boost 有允许运行时大小的数组?我在回答中登陆了std::queue,但每个人都有不同的偏好......干杯,
    • 呃,错字,我的意思是我的答案是std::deque,正如答案中所见......但无论如何,你现在的代码是boost::array&lt;bool, size&gt;,其中size 是运行时值,不会编译。干杯&hth.,
    猜你喜欢
    • 2019-04-14
    • 1970-01-01
    • 2013-01-20
    • 1970-01-01
    • 1970-01-01
    • 2022-08-23
    • 1970-01-01
    • 2018-12-30
    • 1970-01-01
    相关资源
    最近更新 更多