C++ 什么';填充2d std::array和std::vector最有效的方法是什么?

C++ 什么';填充2d std::array和std::vector最有效的方法是什么?,c++,arrays,performance,vector,multidimensional-array,C++,Arrays,Performance,Vector,Multidimensional Array,我通常对一维数组和向量使用.fill(),但对多维数组和向量似乎不起作用。 我已经看到了很多填补空缺的方法,但我想知道最有效的方法是什么 std::array<std::array<bool, 3>, 3> wasPlayed; wasPlayed.fill(false); 这似乎可行,但是否有效?如本文所述,嵌套循环可能是更快填充它们的最佳选择 (基于@juanchopanza的评论) 一种方法是,如果您想使用数组的数组,那么 for(auto& row: w

我通常对一维数组和向量使用
.fill()
,但对多维数组和向量似乎不起作用。 我已经看到了很多填补空缺的方法,但我想知道最有效的方法是什么

std::array<std::array<bool, 3>, 3> wasPlayed;
wasPlayed.fill(false);
这似乎可行,但是否有效?

如本文所述,嵌套循环可能是更快填充它们的最佳选择 (基于@juanchopanza的评论)


一种方法是,如果您想使用数组的数组,那么

for(auto& row: wasPlayed) {
    row.fill(true);
}

使用
false
初始化
bool
std::array
最有效的方法是不要这样做:
bool
的默认初始化是
false
。您在声明之后完成了以下操作:

std::array<std::array<bool, 3>, 3> wasPlayed;
std::数组播放;

Thw最有效的方法可能是创建一个类,包装一个1D数组,并创建一个
operator()(y,x)
以能够作为2D数组访问它。你说的“好”到底是什么意思?因此,它与人们给出的答案一样/更有效如果您担心效率,那么可能会完全避免二维数组的双重间接寻址,只需为数组分配一个块并在其中建立索引。然后,它可以归结为使用
memset()
等设置一个内存块的值。在使用这些对象之前,您想将其作为一个初始化,还是一般来说,像在一个循环中“重置”它们的值?这不只是填充一个[0][0]、一个[1][1]、一个[2][2]?或者索引是否包含其他数组,因此[0]包含[0][0]、[0][1]和[0][2]?否,这将完全填充由[1]、[0]和[2]持有的每个向量。所以所有9个值都将被填充。你确定吗?不适合我。
for_each(a.begin(),a.end(),[](vector<int>& aa)
    {fill(aa.begin(),aa.end(),falseValues);});
for(auto& row: wasPlayed) {
    row.fill(true);
}
std::array<std::array<bool, 3>, 3> wasPlayed;