在没有迭代的情况下填充二维std ::数组的STL方法是什么?

时间:2017-07-04 22:51:30

标签: c++ arrays c++11 multidimensional-array stl

我有一个std::array std::array的{​​{1}},我希望用0填充它。我找到的唯一解决方案是使用指向第一个元素和sizeof的指针,如下所示:

std::fill(&arr2d[0][0], &arr2d[0][0] + sizeof(arr2d), 0);

虽然它有效,但它没有与我在没有指针逻辑时填充1D std::array的其他方法一致,如下所示:

std::fill(arr1d.begin(), arr1d.end(), 0);
arr1d.fill(0);

我可以遍历每个数组,如下所示:

for (auto& it : arr2d) {
    it.fill(0);
}

但似乎在一次通过中填充数组效率会更高。是否有更清晰的2D数组方法,还是我坚持使用C风格的指针逻辑?

2 个答案:

答案 0 :(得分:4)

在您的情况下,只需使用{}分配(或初始化):

using arr2d_t = std::array<std::array<unsigned char, 32>, 64>;
arr2d_t arr2d = {}; // all zeroes

arr2d = {}; //ditto

答案 1 :(得分:0)

我想提出 T.C. 答案的一个变体,它在处理非常大的数组时很有用。

在使用面向 C++ 14 的 Visual Studio 2019(v142 工具)时,我发现 {} 的零初始化使用编译器生成的临时变量,该变量消耗堆栈空间,即使数组本身不在堆栈上:

std::array<std::array<double, 1024>, 1024> myArray;

int main(int argc, char* argv[])
{
    myArray = {}; // <- all zeros but consumes 8,388,608 bytes of stack
    return 0;
}

通过存储匹配类型的零初始化数组的静态副本,您可以稍后随时将静态副本分配或重新分配给感兴趣的数组,这将编译为单个 memcpy 调用:

std::array<std::array<double, 1024>, 1024> myArray;

int main(int argc, char* argv[])
{
    static const std::array<std::array<double, 1024>, 1024> EmptyArray = {}; // all zeros
    myArray = EmptyArray; // all zeros
    return 0;
}