有没有更好的方法来初始化一个数组?

5

给定一个大小为 256 的数组映射,最好的初始化方法是什么,以便每个元素都为 false?

bool map[256];

for (int i=0; i<256; i++)
{
    map[i] = false;
}

谢谢你

5个回答

18
bool map[256] = { false };

编辑:要查看为什么这是合法的标准参考,请参阅下面的答案。


你好,Idan。这是C++中初始化数组所有元素的标准方法吗?--谢谢 - q0987
是的,它在标准中有定义(我们正在查找)。 - Idan K
我已经查过了,如果你还在找,请看我的答案中的段落号。 - Steve Jessop

15
bool map[256] = {false};

(C++也允许使用bool map[256] = {};。以上语句在 C 语言中同样适用。)

这将把map[0]设置为false,并会对其他255个成员进行“默认初始化”(C++98 §8.5.1/7:“如果初始化列表中的初始值少于聚合体中的成员数,则未明确初始化的每个成员都将被默认初始化”;C99 §6.7.8/21)。

对于bool类型,“默认初始化”意味着设置为(bool)0,即false(C++98 §8.5/5;C99 §6.7.8/10)。

请注意,如果您想进行初始化为true,则此方法将不起作用。


你好Als,谢谢你提醒我C语言没有bool类型。 - q0987
2
@q0987:C语言现在已经有布尔类型11年了。例如,11年前还不存在C#。 - eq-
1
@KennyTM:我认为在TC1/C++03中添加了值初始化,而在该标准中,附加成员是值初始化的,而不是默认初始化。虽然在这种情况下没有任何区别。如果您知道实现C++98但不支持C++03的编译器,请将其删除并射击它;-) - Steve Jessop
@Als 这种初始化形式可在 C99 中使用。 @q0987 通过使用 <stdbool.h> 头文件,可以在 C99 中使用 bool 类型。 - Marc Butler
1
+1 如果提到它对于“true”不起作用。 - jgottula
显示剩余2条评论

7
像这样:
bool map[256] = { 0 };

有些人会说:

bool map[256] = {};

但对我来说,那看起来有点奇怪。

为什么要使用“0”而不是“false”?这并不重要,但我这样做是因为数组初始化程序实际上是用“0”填充数组的大小,而不是用第一个元素的副本。由于元素1到255的初始化是根据值“0”定义的(当然可以转换为false),所以我认为元素0也被初始化为“0”是无害的。在标量类型的太短的初始化程序列表末尾放置一个“0”让我想起了正在发生的事情。

具体来说,标准在8.5.1/7(初始化程序列表短于数组)和8.5/5(使用值0转换为bool等效于使用该值初始化bool)中定义了这一点。


3

如果没有其他原因,最好的选择可能是使用向量:

std::vector<bool> map(256, false);

vector<bool>是一个特化版本,与你所期望的有很大不同。根据情况,你可能更喜欢:

std::vector<char> map(256, false);

2
在C++中,X = { 0 }是一种惯用的通用零初始化器。这是从C中继承而来的特性。
bool map[256] = { 0 };

如果你想非常严谨,C++会用0构造第一个元素,并使用值构造其他元素。对于像bool这样的标量类型,这都归结为零初始化(这就是为什么在这种情况下只是纠结),但对于类类型可能会有所不同。 - Steve Jessop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接