在一个二维int向量上使用std::fill函数

5

我正在尝试将2D向量中所有元素的值设置为特定值。据我所知,人们不能像对待数组那样使用memset来处理向量。因此,我必须使用std::fill来设置2D向量中所有元素的值。然而,我知道如何在1D向量中使用fill,如下所示。

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);

注意,我可以轻松地设计一个嵌套的for循环来手动设置2D向量的元素值。 但是,在我的程序中,这并不可行,因为2D向量的大小相当大,并且有其他耗时的函数(递归函数)正在同时进行。


4
提示:这不是一个二维向量,而是一个向量的向量。 - eesiraed
1
提示:当您初始化twoDVector时,已经填充了每个元素(以及每个元素的每个元素)的相同值。 - Caleth
实际上可以,使用data()方法返回原始数组,然后可以使用memset。自C++11起可用。但是对于向量的大小和容量之间的差异需要小心。 - Marco Luzzara
3个回答

3
在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

这应该能帮助您

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

参考:初始化二维std::vector


2
你可以像这样使用:

你可以像这样使用:

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

2
那样做的效率比嵌套循环低。 - juanchopanza
这可能不太高效,但我认为更易读和可维护(在我看来)。 - nivalderramas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接