数组初始化有一个很好的数组初始化列表。我有一个
int array[100] = {-1};
期望它充满-1,但它不是,只有第一个值是,其余都是0和随机值的混合。
的代码
int array[100] = {0};
工作很好,并将每个元素设置为0。
我错过了什么…如果值不为零,就不能初始化它吗?
和2:是默认的初始化(如上所述)比通常的循环通过整个数组和赋值还是做同样的事情?
数组初始化有一个很好的数组初始化列表。我有一个
int array[100] = {-1};
期望它充满-1,但它不是,只有第一个值是,其余都是0和随机值的混合。
的代码
int array[100] = {0};
工作很好,并将每个元素设置为0。
我错过了什么…如果值不为零,就不能初始化它吗?
和2:是默认的初始化(如上所述)比通常的循环通过整个数组和赋值还是做同样的事情?
当前回答
对于单字节元素数组,可以使用memset将所有元素设置为相同的值。
这里有一个例子。
其他回答
c++ 11还有另一个(不完善的)选项:
std::array<int, 100> a;
a.fill(-1);
最简单的方法是使用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++编程语言V4中,Stroustrup建议使用vector或valarray而不是内置数组。使用valarray,当你创建它们时,你可以初始化它们为一个特定的值,比如:
valarray <int>seven7s=(7777777,7);
初始化一个包含"7777777"成员的数组。
这是一种c++实现答案的方式,使用c++数据结构而不是“普通的旧C”数组。
我转而使用valarray作为在我的代码中尝试使用c++ 'isms v. C'isms....的尝试
gcc编译器有一个扩展,允许以下语法:
int array[100] = { [0 ... 99] = -1 };
这将把所有元素都设为-1。
这被称为“指定初始化器”,更多信息请参见这里。
注意,这不是gcc c++编译器实现的。
您链接的页面状态
如果指定了显式数组大小,但指定了较短的初始化列表,则未指定的元素将被设置为零。
速度问题:对于这么小的数组,任何差异都可以忽略不计。如果您使用大型数组,并且速度比大小更重要,那么您可以使用默认值的const数组(在编译时初始化),然后将它们memcpy到可修改数组。