【问题标题】:what's the most efficient way to fill 2d std::array and std::vector?填充 2d std::array 和 std::vector 的最有效方法是什么?
【发布时间】:2021-07-27 04:27:18
【问题描述】:

我通常将.fill() 与一维数组和向量一起使用,但它似乎不适用于多维数组和向量。 我见过很多填充它们的方法,但我想知道最有效的方法是什么。

std::array<std::array<bool, 3>, 3> wasPlayed;
wasPlayed.fill(false);

这不起作用,用false 值填充wasPlayed 的最高效方法是什么?

玩了一下,发现是这样的:

for(int i = 0; i < 3; i++){
    wasPlayed[i].fill(false);
}

这似乎有效,但它有效吗?

【问题讨论】:

  • 最高效的可能是创建一个类,包装一维数组,然后创建一个operator()(y,x) 以便能够将其作为二维数组访问。
  • “好”到底是什么意思?
  • @Zoso 与人们给出的答案一样/更有效
  • 如果您担心效率,那么可能完全避免二维数组的双重间接,只需分配一个块并为数组索引。然后归结为使用memset() 等设置具有值的内存块。
  • @Justin 从值初始化page, "4) 否则,对象被零初始化。", meaning "如果T是一个标量类型,对象的初始值是显式转换为 T 的整数常量零。".在标准中你可以找到7.3.15 conv.bool "算术纯右值,...类型可以转换为布尔类型的纯右值。零值,...转换为假;任何其他值都转换为真的。”.

标签: c++ arrays performance vector multidimensional-array


【解决方案1】:

用false 初始化bool 的std::array 的最有效方法是不这样做:bool 的默认初始化是false。声明后就完成了:

std::array<std::array<bool, 3>, 3> wasPlayed;

【讨论】:

    【解决方案2】:

    从这里引用using std::fill on a 2D int vector,嵌套循环可能是更快填充它们的最佳选择 (基于@juanchopanza 的评论)

    vector<vector<int> > a(3,vector<int>(3));
    
    for (int i = 0 ; i < 3; i++)
       fill(a[i].begin(),a[i].end(),falseValues);
    

    c++14及以上也可以使用

    for_each(a.begin(),a.end(),[](vector<int>& aa)
        {fill(aa.begin(),aa.end(),falseValues);});
    

    【讨论】:

    • 这不会只填充 a[0][0], a[1][1], a[2][2] 吗?或者索引是否包含其他数组,因此 a[0] 包含 a[0][0]、a[0][1] 和 a[0][2]?
    • 不,这会完全填充由 a[1]、a[0]、a[2] 保存的向量中的每一个。所以所有 9 个值都将被填充。
    【解决方案3】:

    一种方法,如果你想使用数组数组,就像

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

    【讨论】:

      猜你喜欢
      • 2019-08-31
      • 1970-01-01
      • 2021-05-29
      • 2013-04-19
      • 2020-04-18
      • 1970-01-01
      • 2018-12-25
      • 1970-01-01
      • 2013-09-27
      相关资源
      最近更新 更多