【发布时间】:2021-12-20 04:37:41
【问题描述】:
我的主要目标是将std::vector 与ompenMP 结合起来进行一些并行计算。我想使用Z boson's answer,每个线程都在自己的向量副本上工作,最后,我们std::copy 从所有私有向量到全局向量。考虑这个例子:
#include<iostream>
#include <vector>
const int N = 10;
class foo {
public:
foo(int i) : heavy(i), ptr(nullptr) { }
foo() : heavy(0), ptr(nullptr) { } // needed by std::vector.resize()
const int heavy; // type is not assignable ...
foo * const ptr; // drop const to make it work
};
int main() {
std::vector<foo> tree;
tree.resize(N);
for (int i = 0; i < N; i += 2) {
std::vector<foo> vec_private;
vec_private.emplace_back(i );
vec_private.emplace_back(i+1);
std::copy(vec_private.begin(), vec_private.end(), tree.begin() + i);
}
for (auto& x : tree)
std::cout << x.heavy << '\n';
return 0;
}
-
我有充分的理由将这些
consts 保留在foo类中。有没有 有什么办法可以保留它们并且不会出现编译时错误? -
是否可以使用移动语义来获得更好的性能 (并可能解决问题 1)?
据我所知,std::vector 的元素必须存储为连续的内存块,所以我不确定移动语义是否适用于此。
【问题讨论】:
-
为什么你需要调整
tree的大小然后覆盖你添加的元素?你不会对那些默认构造的元素做任何事情,那么为什么要打扰它们呢?插入而不是覆盖应该可以,不是吗? (原因和你的并行处理有关吗?) -
正如 Yalkov 指出的那样,插入(例如
back_inserter)只能在顺序方法中起作用,但是对于多个线程,我们必须先验地知道tree的大小。 -
啊...复制行中有一个
+i。这很容易被忽略,这是一个很好的例子,说明为什么你应该总是解释你的代码打算做什么。不要依赖其他人正确解释您的代码,尤其是当您知道您的代码不完全正确时(这是这里的每个问题,因为没有人询问正确的代码)。
标签: c++ c++11 containers openmp