给定一个大小为 256 的数组映射,最好的初始化方法是什么,以便每个元素都为 false?
bool map[256];
for (int i=0; i<256; i++)
{
map[i] = false;
}
谢谢你
给定一个大小为 256 的数组映射,最好的初始化方法是什么,以便每个元素都为 false?
bool map[256];
for (int i=0; i<256; i++)
{
map[i] = false;
}
谢谢你
bool map[256] = { false };
编辑:要查看为什么这是合法的标准参考,请参阅下面的答案。
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
,则此方法将不起作用。
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
)中定义了这一点。
如果没有其他原因,最好的选择可能是使用向量:
std::vector<bool> map(256, false);
vector<bool>
是一个特化版本,与你所期望的有很大不同。根据情况,你可能更喜欢:
std::vector<char> map(256, false);
bool map[256] = { 0 };
0
构造第一个元素,并使用值构造其他元素。对于像bool
这样的标量类型,这都归结为零初始化(这就是为什么在这种情况下只是纠结),但对于类类型可能会有所不同。 - Steve Jessop