c++ - 设置动态数组的默认值

标签 c++ arrays dynamic

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

bool boolArray[100] = false;

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

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

最佳答案

在标准 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<bool> 中的过早优化。 ,否则这将是自然的选择。本质上 std::vector<bool>每个值只使用一位,因此它不能分发对 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;
}

干杯,

关于c++ - 设置动态数组的默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4262914/

相关文章:

javascript - 为什么 "myValue = myArray[1.5];"不返回错误?

java - Android:将选择的不同布局动态加载到另一个布局中

c++ - Kdevelop 步骤和断点不起作用

c++ - 指向类数据成员 "::*"的指针

c++ - 枚举所有注册表项的最有效方法

php - 如何将字符串转换为仅包含双引号字符的数组

c++ - SFINAE 用于泛型类型的泛型操作

c# - .NET 中的空数组是否使用任何空间?

jquery - 使用jquery创建动态数组

javascript - 输入的动态修改值未反射(reflect)在 DOM 中