【发布时间】:2017-12-08 10:52:47
【问题描述】:
我有一个二维的std::array std::arrays,我想用 0 填充它。我找到的唯一解决方案是使用指向第一个元素和sizeof 的指针,如下所示:
std::fill(&arr2d[0][0], &arr2d[0][0] + sizeof(arr2d), 0);
虽然它有效,但它与我发现的用于填充 1D std::arrays 而不使用指针逻辑的其他方法不一致,例如以下两个:
std::fill(arr1d.begin(), arr1d.end(), 0);
arr1d.fill(0);
我可以遍历每个数组,如下所示:
for (auto& it : arr2d) {
it.fill(0);
}
但似乎一次填充数组会更有效率。二维数组有没有更简洁的方法,还是我坚持使用 C 风格的指针逻辑?
【问题讨论】:
-
你为什么认为
std::fill不会推出类似的循环。如果您希望填写 0,则可以使用std::memset。 -
@DeiDei 我的 C++ 编程目标之一是避免像
memset这样的 C 风格逻辑。我不认为std::fill或std::memset会或不会像我的示例那样滚动循环。我相信实现编写者是比我更好的程序员,并且根据需要进行了优化。 -
1.数组元素类型是什么? 2. 填0还是任意值?
-
std::fill(arr2d.begin(), arr2d.end(), decltype(arr2d)::value_type{0})或arr2d.fill(decltype(arr2d)::value_type{0})。随意拼出实际类型来代替decltype(arr2d)::value_type;当你选择隐瞒arr2d的声明时,你让我别无选择,只能从事这些赞美诗 -
@IgorTandetnik 感谢您的回答。有问题的数组的类型是
BYTE,实际上是std::uint8_t的类型别名。不幸的是,你给我的答案都没有奏效。使用std::fill给我一个神秘的STL 错误,而使用std::array::fill给我error: no matching function for call to 'std::array<std::array<unsigned char, 32ul>, 64ul>::fill(BYTE)'
标签: c++ arrays c++11 multidimensional-array stl