【问题标题】:Set an array to zero with c++11使用 c++11 将数组设置为零
【发布时间】:2017-12-15 14:17:48
【问题描述】:

我只是想将一个完整的数组设置回 0。类似于“重置”方法。
我知道我可以使用类似的方法将数组初始化为零:

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

但我不确定是否重置它。 array[100] = {0}; 之类的东西只将 100 个元素设置为 0。我知道我可以使用 for 循环来做到这一点,但必须有更好的方法。
由于编码准则的原因,我不允许使用 memset。

【问题讨论】:

  • 使用std::arraystd::vector
  • "Something like array[100] = {0}; only set the 100-element to 0" 不,不是,那是UB它可以做任何事情。
  • 你给出的例子其实是原版C,而原版C中对数组的帮助很少,除了memset。将模板包裹在你的 memset 周围是否可以接受?
  • @GemTaylor 遗憾的是它不是。真的吗?我认为数组初始化是自 c++11 以来的一部分,在 c 中是不可能的。我可能在这里错了。
  • std::array 是你的朋友。这是一个更安全的数组。它只是一个普通的内置数组,因此没有内存分配开销。

标签: c++ arrays c++11


【解决方案1】:

你可以使用std::fill:

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

【讨论】:

    【解决方案2】:

    对于诸如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 = {};
    

    【讨论】:

    • 如果你更清楚,std::array 也有arr.fill(0)
    • @chris 谢谢你,我已经附上了我的答案。
    • 怎么知道foo = {}分配的默认值?
    • @Phlucious 那是aggregate initialization。如果列表为空或小于元素数,则剩余元素为value initialized。对于int 类型的元素,这意味着将它们初始化为零。
    • 如果你想创建一个初始化为零的std::array,你可以将数组创建为c++ std::array<int, 100> row({0}); ,因为它的构造中的对象调用std::fill_n,对于C++20,我不知道不知道以前的标准。
    猜你喜欢
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    • 2011-10-12
    • 2023-01-11
    • 1970-01-01
    相关资源
    最近更新 更多