首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否在C++中将数组的所有元素初始化为一个默认值?

是否在C++中将数组的所有元素初始化为一个默认值?
EN

Stack Overflow用户
提问于 2009-06-30 20:10:25
回答 13查看 511.6K关注 0票数 297

C++ Notes: Array Initialization有一个关于数组初始化的很好的列表。我有一个

代码语言:javascript
运行
复制
int array[100] = {-1};

期望它充满-1,但事实并非如此,只有第一个值是,其余的都是0和随机值的混合。

代码

代码语言:javascript
运行
复制
int array[100] = {0};

工作正常,并将每个元素设置为0。

我在这里错过了什么..。如果值不是零,就不能初始化它吗?

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

EN

回答 13

Stack Overflow用户

回答已采纳

发布于 2009-06-30 20:14:11

使用您使用的语法,

代码语言:javascript
运行
复制
int array[100] = {-1};

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

在C++中,要将它们都设置为-1,可以使用类似于std::fill_n (来自<algorithm>)的命令:

代码语言:javascript
运行
复制
std::fill_n(array, 100, -1);

在可移植的C中,你必须使用你自己的循环。有编译器扩展,或者您可以依赖于实现定义的行为作为快捷方式,如果这是可以接受的。

票数 404
EN

Stack Overflow用户

发布于 2009-06-30 20:22:07

有一个对gcc编译器的扩展,它允许使用以下语法:

代码语言:javascript
运行
复制
int array[100] = { [0 ... 99] = -1 };

这会将所有元素设置为-1。

这就是所谓的“指定初始化器”。有关详细信息,请参阅here

注意:这不是为gcc c++编译器实现的。

票数 151
EN

Stack Overflow用户

发布于 2009-06-30 20:18:27

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

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

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

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

代码语言:javascript
运行
复制
int array[100] = {0};

简单地告诉编译器“将这100个整数设置为零”,编译器可以自由优化。

代码语言:javascript
运行
复制
for (int i = 0; i < 100; ++i){
  array[i] = 0;
}

更加具体。它告诉编译器创建一个迭代变量i,它告诉它元素应该被初始化的顺序,等等。当然,编译器可能会对此进行优化,但问题的关键在于,您在这里过度指定了问题,迫使编译器更加努力地工作以获得相同的结果。

最后,如果希望将数组设置为非零值,则应该(至少在C++中)使用std::fill

代码语言:javascript
运行
复制
std::fill(array, array+100, 42); // sets every value in the array to 42

同样,您也可以对数组执行相同的操作,但这更简洁,并给了编译器更多的自由。您只是想让整个数组充满值42。你没有说任何关于它应该按什么顺序完成的事情,或者任何其他的事情。

票数 40
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1065774

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档