数组初始化有一个很好的数组初始化列表。我有一个
int array[100] = {-1};
期望它充满-1,但它不是,只有第一个值是,其余都是0和随机值的混合。
的代码
int array[100] = {0};
工作很好,并将每个元素设置为0。
我错过了什么…如果值不为零,就不能初始化它吗?
和2:是默认的初始化(如上所述)比通常的循环通过整个数组和赋值还是做同样的事情?
数组初始化有一个很好的数组初始化列表。我有一个
int array[100] = {-1};
期望它充满-1,但它不是,只有第一个值是,其余都是0和随机值的混合。
的代码
int array[100] = {0};
工作很好,并将每个元素设置为0。
我错过了什么…如果值不为零,就不能初始化它吗?
和2:是默认的初始化(如上所述)比通常的循环通过整个数组和赋值还是做同样的事情?
当前回答
你所链接的页面已经给出了第一部分的答案:
如果显式数组大小为 指定,但更短 初始化列表,则 未指定的元素被设置为零。
没有内置方法将整个数组初始化为某个非零值。
至于哪个更快,通常的规则是:“给编译器最大自由的方法可能更快”。
int array[100] = {0};
简单地告诉编译器“将这100个整数设置为零”,编译器可以自由优化。
for (int i = 0; i < 100; ++i){
array[i] = 0;
}
更加具体。它告诉编译器创建一个迭代变量i,它告诉编译器元素初始化的顺序,等等。当然,编译器很可能会优化掉这个问题,但问题的关键在于,这里您过度指定了问题,迫使编译器更加努力地工作才能得到相同的结果。
最后,如果你想将数组设置为一个非零值,你应该(至少在c++中)使用std::fill:
std::fill(array, array+100, 42); // sets every value in the array to 42
同样,你也可以用数组来做同样的事情,但是这样更简洁,并且给了编译器更多的自由。你只是说你想让整个数组充满值42。你没有说应该按什么顺序做,或者其他什么。
其他回答
最简单的方法是使用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;
}
}
演示工作
另一种将数组初始化为公共值的方法是实际生成一系列定义中的元素列表:
#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进行宏替换
1)当你使用初始化式时,对于一个结构或数组,未指定的值本质上是默认构造的。对于像int这样的基本类型,这意味着它们将被归零。注意,这是递归应用的:你可以有一个包含数组的结构体数组,如果你只指定第一个结构体的第一个字段,那么其余的都将用0和默认构造函数初始化。
2)编译器生成的初始化代码至少和你手工编写的一样好。如果可能的话,我倾向于让编译器为我进行初始化。
你所链接的页面已经给出了第一部分的答案:
如果显式数组大小为 指定,但更短 初始化列表,则 未指定的元素被设置为零。
没有内置方法将整个数组初始化为某个非零值。
至于哪个更快,通常的规则是:“给编译器最大自由的方法可能更快”。
int array[100] = {0};
简单地告诉编译器“将这100个整数设置为零”,编译器可以自由优化。
for (int i = 0; i < 100; ++i){
array[i] = 0;
}
更加具体。它告诉编译器创建一个迭代变量i,它告诉编译器元素初始化的顺序,等等。当然,编译器很可能会优化掉这个问题,但问题的关键在于,这里您过度指定了问题,迫使编译器更加努力地工作才能得到相同的结果。
最后,如果你想将数组设置为一个非零值,你应该(至少在c++中)使用std::fill:
std::fill(array, array+100, 42); // sets every value in the array to 42
同样,你也可以用数组来做同样的事情,但是这样更简洁,并且给了编译器更多的自由。你只是说你想让整个数组充满值42。你没有说应该按什么顺序做,或者其他什么。
gcc编译器有一个扩展,允许以下语法:
int array[100] = { [0 ... 99] = -1 };
这将把所有元素都设为-1。
这被称为“指定初始化器”,更多信息请参见这里。
注意,这不是gcc c++编译器实现的。