C++:为 std::vector 分配内存,然后并行初始化其元素

dav*_*ewy 6 c++ vector openmp

我有一个用例来创建std::vector具有许多元素的 ,每个元素都是简单但非原始的类型(POD 结构)。向量和类型足够大/复杂,在下面,

std::vector<U> v;
v.resize(1000000000);
for(size_t i=0;i<v.size();++i){/* initialize v[i] */}
Run Code Online (Sandbox Code Playgroud)

resize呼叫是明显减慢。这很浪费,因为resize默认初始化所有这些条目,然后我循环遍历并将它们全部设置为正确/有用的值。

我想做的是为向量分配所有内存,但不初始化任何条目,然后并行执行并初始化所有条目,例如使用 OpenMP

std::vector<U> v;
v.reserve(1000000000);
#pragma omp parallel for
for(size_t i=0;i<v.size();++i){/* initialize v[i] */}
Run Code Online (Sandbox Code Playgroud)

但是,reserve实际上并没有改变 的大小v,所以我必须继续push_back在我的循环中进行,这不会保持元素的正确顺序(这在我的用例中很重要);我真的很想v[i] = ...在我的循环体中写一些类似的东西。

有没有办法在不初始化任何元素的情况下分配/“初始化”一个向量,然后并行填充/初始化所有元素?

Ric*_*ard 4

您的选择是:

执行调整大小后,您可以按常规方式使用 OpenMP。