在 2D int 向量上使用 std::fill

Posted

技术标签:

【中文标题】在 2D int 向量上使用 std::fill【英文标题】:using std::fill on a 2D int vector 【发布时间】:2018-07-04 05:05:55 【问题描述】:

我正在尝试将 2D 矢量中所有元素的值设置为特定值。据我所知,不能将 memset 用于向量,就像它们用于数组一样。因此,我必须使用 std::fill 将 2D 向量中的所有元素设置为特定值。但是,我知道如何对一维向量使用填充,如下所示。

vector<int> linearVector (1000,0);
fill(linearVector.begin(),linearVector.end(),10);

但是,当我尝试对 2D 矢量(如下所示)执行类似操作时,它不起作用。

vector<vector<int> > twoDVector (100,vector <int> (100,0));
fill(twoDVector.begin(),twoDVector.end(),10);

PS:我知道我可以很容易地设计一个嵌套的 for 循环来手动将 2D 向量的元素设置为我想要的值。但是,在我的程序中这是不可行的,因为 2D 向量的大小非常大,并且还有其他耗时的函数(递归函数)并行发生。

【问题讨论】:

提示:它不是二维向量。它是向量的向量。 提示:当你初始化 twoDVector 的每个元素(以及每个元素的每个元素)时,你已经用相同的值填充了它 不能将 memset 用于向量,就像它们如何用于数组一样:实际上你可以,data() 方法返回原始数组,然后你可以使用 @987654325 @。仅从 C++ 11 开始。 【参考方案1】:

这应该对你有帮助

std::vector<std::vector<int> > fog(
A_NUMBER,
std::vector<int>(OTHER_NUMBER)); // Defaults to zero initial value

参考:Initializing a two dimensional std::vector

【讨论】:

【参考方案2】:

在 C++17 中你可以这样做:

#include <algorithm>
#include <execution>
#include <vector>

//...    

std::for_each(std::execution::par_unseq, nums.begin(), nums.end(),
    [](std::vector<int>& vec) 
    std::for_each(std::execution::par_unseq, vec.begin(), vec.end(),
    [](int& n) n = 10;);
);

看起来是平行的,但不如简单的填充函数那么清晰;)

当然你可以传递你自己的变量而不是硬编码的10

【讨论】:

【参考方案3】:

你可以这样使用:

fill(twoDVector.begin(), twoDVector.end(), vector<int>(100, 10));

【讨论】:

这样会比嵌套循环效率低。

以上是关于在 2D int 向量上使用 std::fill的主要内容,如果未能解决你的问题,请参考以下文章

使 C++ 模拟类同时使用 2D 和 3D 向量

为啥 std::fill(0) 比 std::fill(1) 慢?

用零并行填充 std::vector

如何在 C++ 中将输入正确读入 2D 向量 vector<vector<int>>

向量 C++ 上的 Memset

将 std::vector<int> 的每个值重置为 0 的最快方法