数组初始化有一个很好的数组初始化列表。我有一个

int array[100] = {-1};

期望它充满-1,但它不是,只有第一个值是,其余都是0和随机值的混合。

的代码

int array[100] = {0};

工作很好,并将每个元素设置为0。

我错过了什么…如果值不为零,就不能初始化它吗?

和2:是默认的初始化(如上所述)比通常的循环通过整个数组和赋值还是做同样的事情?


当前回答

您链接的页面状态

如果指定了显式数组大小,但指定了较短的初始化列表,则未指定的元素将被设置为零。

速度问题:对于这么小的数组,任何差异都可以忽略不计。如果您使用大型数组,并且速度比大小更重要,那么您可以使用默认值的const数组(在编译时初始化),然后将它们memcpy到可修改数组。

其他回答

另一种将数组初始化为公共值的方法是实际生成一系列定义中的元素列表:

#define DUP1( X ) ( X )
#define DUP2( X ) DUP1( X ), ( X )
#define DUP3( X ) DUP2( X ), ( X )
#define DUP4( X ) DUP3( X ), ( X )
#define DUP5( X ) DUP4( X ), ( X )
.
.
#define DUP100( X ) DUP99( X ), ( X )

#define DUPx( X, N ) DUP##N( X )
#define DUP( X, N ) DUPx( X, N )

将数组初始化为一个公共值很容易做到:

#define LIST_MAX 6
static unsigned char List[ LIST_MAX ]= { DUP( 123, LIST_MAX ) };

注意:引入DUPx是为了在参数中对DUP进行宏替换

您链接的页面状态

如果指定了显式数组大小,但指定了较短的初始化列表,则未指定的元素将被设置为零。

速度问题:对于这么小的数组,任何差异都可以忽略不计。如果您使用大型数组,并且速度比大小更重要,那么您可以使用默认值的const数组(在编译时初始化),然后将它们memcpy到可修改数组。

最简单的方法是使用std::array并编写一个函数模板,该函数模板将返回所需的std::array,其中所有元素都用传递的参数初始化,如下所示。

c++ 11版本

template<std::size_t N> std::array<int, N> make_array(int val)
{
    std::array<int, N> tempArray{};
    for(int &elem:tempArray)
    {
        elem = val;
    }
    return tempArray;
}
int main()
{
    //---------------------V-------->number of elements  
    auto arr  = make_array<8>(5);
    //------------------------^---->value of element to be initialized with

    
    //lets confirm if all objects have the expected value 
    for(const auto &elem: arr)
    {
        std::cout << elem << std::endl; //prints all 5 
    }
    
}

演示工作


c++ 17版本

在c++ 17中,你可以将constexpr添加到函数模板中,这样它就可以在constexpr上下文中使用:

//-----------------------------------------vvvvvvvvv--->added constexpr
template<std::size_t N> std::array<int, N> constexpr make_array(int val)
{
    std::array<int, N> tempArray{};
    for(int &elem:tempArray)
    {
        elem = val;
    }
    return tempArray;
}
int main()
{
//--vvvvvvvvv------------------------------>constexpr added
    constexpr auto arr  = make_array<8>(5);

    for(const auto &elem: arr)
    {
        std::cout << elem << std::endl;
    }
    
}

演示工作

c++ 11还有另一个(不完善的)选项:

std::array<int, 100> a;
a.fill(-1);

使用{}可以在声明元素时赋值;其余部分初始化为0。

如果没有={}来初始化,则内容是未定义的。