使用C++11将数组设为零

14

我只想将整个数组设置为0,就像一个“重置”方法。
我知道我可以使用以下方式将数组初始化为零:

int array[100] = {0};     //possible since c++11

但我不确定该如何重置它。类似于array[100] = {0};只会将第100个元素设置为0。我知道我可以用for循环来做,但一定有更好的方法。
由于编码指南的限制,我不能使用memset。


4
使用std::array或std::vector。 - Slava
2
类似于array[100] = {0};这样的语句只会将第100个元素设置为0,但实际上这是未定义行为,可能会导致任何结果。 - Slava
你提供的示例实际上是原始的C语言,在原始的C语言中,除了memset之外,对于数组几乎没有什么帮助。在您的memset周围包装一个模板是否可行? - Gem Taylor
1
std::array 是你的好朋友。它是一个更安全的数组。它只是一个普通的内置数组,因此没有内存分配开销。 - Nikos C.
C++11引入了在C++对象上使用C风格初始化的能力。自70年代以来,C已经有了char strArray [] ="Hello world"; - Gem Taylor
显示剩余5条评论
2个回答

29
你可以使用std::fill
std::fill(std::begin(array), std::end(array), 0);

24

对于像int array[100]这样的C风格数组,只要array是一个数组,就可以使用std::fill。指向数组的指针将不起作用。

std::fill(std::begin(array), std::end(array), 0);

如果你正在使用指向第一个元素的指针,你必须自己提供数组的大小。

std::fill(array, array + size, 0);

在C++中,推荐使用std::array代替C风格的数组。例如,你可以使用std::array<int, 100> foo;来代替int foo[100];std::array总是知道自己的大小,不会隐式地衰减为指针,并且具有值语义。通过使用std::array,你可以简单地重置数组:

foo.fill(0);
或者
foo = {};

你如何知道 foo = {} 分配的默认值是什么? - Phlucious
1
@Phlucious 这是聚合初始化。如果列表为空或短于元素数量,则剩余元素将被值初始化。对于int类型的元素,这意味着将它们初始化为零。 - François Andrieux
1
如果您想创建一个初始化为零的 std::array,可以按以下方式创建数组:std::array row({0});因为在其构造中调用了 std::fill_n 对象,对于 C++20,我不知道之前的标准。 - sɪʒɪhɪŋ βɪstɦa kxɐll

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