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

int array[100] = {-1};

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

的代码

int array[100] = {0};

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

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

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


当前回答

您链接的页面状态

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

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

其他回答

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

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

在c++编程语言V4中,Stroustrup建议使用vector或valarray而不是内置数组。使用valarray,当你创建它们时,你可以初始化它们为一个特定的值,比如:

valarray <int>seven7s=(7777777,7);

初始化一个包含"7777777"成员的数组。

这是一种c++实现答案的方式,使用c++数据结构而不是“普通的旧C”数组。

我转而使用valarray作为在我的代码中尝试使用c++ 'isms v. C'isms....的尝试

你所链接的页面已经给出了第一部分的答案:

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

没有内置方法将整个数组初始化为某个非零值。

至于哪个更快,通常的规则是:“给编译器最大自由的方法可能更快”。

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。你没有说应该按什么顺序做,或者其他什么。

用你用过的语法,

int array[100] = {-1};

表示“将第一个元素设置为-1,其余为0”,因为所有省略的元素都设置为0。

在c++中,要将它们都设置为-1,你可以使用类似std::fill_n (from <algorithm>):

std::fill_n(array, 100, -1);

在便携式C语言中,你必须自己进行循环。有编译器扩展,或者如果可以接受,可以依赖实现定义的行为作为快捷方式。

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

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