我有一个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风格的指针逻辑?
答案 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;
}