C++ Notes: Array Initialization有一个关于数组初始化的很好的列表。我有一个
int array[100] = {-1};期望它充满-1,但事实并非如此,只有第一个值是,其余的都是0和随机值的混合。
代码
int array[100] = {0};工作正常,并将每个元素设置为0。
我在这里错过了什么..。如果值不是零,就不能初始化它吗?
和2:默认初始化(如上所述)是否比通常的遍历整个数组并赋值的循环更快,还是做同样的事情?
发布于 2009-06-30 20:14:11
使用您使用的语法,
int array[100] = {-1};表示“将第一个元素设置为-1,其余元素设置为0”,因为所有省略的元素都设置为0。
在C++中,要将它们都设置为-1,可以使用类似于std::fill_n (来自<algorithm>)的命令:
std::fill_n(array, 100, -1);在可移植的C中,你必须使用你自己的循环。有编译器扩展,或者您可以依赖于实现定义的行为作为快捷方式,如果这是可以接受的。
发布于 2009-06-30 20:22:07
有一个对gcc编译器的扩展,它允许使用以下语法:
int array[100] = { [0 ... 99] = -1 };这会将所有元素设置为-1。
这就是所谓的“指定初始化器”。有关详细信息,请参阅here。
注意:这不是为gcc c++编译器实现的。
发布于 2009-06-30 20:18:27
您链接到的页面已经给出了第一部分的答案:
如果指定了显式数组大小,但指定了较短的初始化列表,则未指定的元素将设置为零。
没有内置的方法可以将整个数组初始化为某个非零值。
至于哪个更快,通常的规则是:“给予编译器最大自由度的方法可能更快”。
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。你没有说任何关于它应该按什么顺序完成的事情,或者任何其他的事情。
https://stackoverflow.com/questions/1065774
复制相似问题