C++ 使用TBB并行创建向量

C++ 使用TBB并行创建向量,c++,parallel-processing,tbb,C++,Parallel Processing,Tbb,我有一个向量foo和一个函数浮动条(int)。使用算法库,我可以用 transform(foo.begin(), foo.end(), quux.begin(), bar); 我的foo函数恰好非常慢,我希望使用TBB库跨多个线程并行化此代码。我认为这是一个理想的情况,因为所有的操作都是独立的。然而,似乎没有一种并行变换算法。我看到的每一个用于算法的parallel\u示例都会将数据放回原始数组,但我无法这样做,因为我正在更改类型。您可以使用对目标的引用来实现它。示例代码: std::vect

我有一个
向量foo
和一个函数
浮动条(int)
。使用
算法
库,我可以用

transform(foo.begin(), foo.end(), quux.begin(), bar);

我的
foo
函数恰好非常慢,我希望使用TBB库跨多个线程并行化此代码。我认为这是一个理想的情况,因为所有的操作都是独立的。然而,似乎没有一种并行变换算法。我看到的每一个用于算法的
parallel\u示例都会将数据放回原始数组,但我无法这样做,因为我正在更改类型。

您可以使用对目标的引用来实现它。示例代码:

std::vector<float> quux(foo.size());
parallel_for(size_t(0), foo.size(), [&foo,&quux] (size_t i) {
    quux[i] = bar(foo[i]);
});
std::vector qux(foo.size());
(size_t(0),foo.size(),[&foo,&qux](size_t i)的并行{
qux[i]=bar(foo[i]);
});

您可以使用对目标的引用来实现它。示例代码:

std::vector<float> quux(foo.size());
parallel_for(size_t(0), foo.size(), [&foo,&quux] (size_t i) {
    quux[i] = bar(foo[i]);
});
std::vector qux(foo.size());
(size_t(0),foo.size(),[&foo,&qux](size_t i)的并行{
qux[i]=bar(foo[i]);
});

只需使用
foo
的内容初始化
qux
,并按正常方式进行转换。虽然这在这种特定情况下有效,但如果foo是float,qux是int,bar将浮点转换为int。我想知道是否有更通用的解决方案TD::transform具有用于并行执行的重载。它在标准库中。它在VisualStudio上运行良好。我不知道其他的编译器套件。也许他们缺乏对这个特性的支持。@phön是的,这是C++17的特性。目前,支持各不相同。GCC 9.1使用TBB支持它(因此需要安装TBB并链接它才能工作)。只需使用
foo
的内容初始化
qux
,并正常转换即可。虽然在这种特定情况下可以工作,但如果foo是浮动,qux是int,bar将浮点转换为int。我想知道是否有更通用的解决方案TD::transform具有用于并行执行的重载。它在标准库中。它在VisualStudio上运行良好。我不知道其他的编译器套件。也许他们缺乏对这个特性的支持。@phön是的,这是C++17的特性。目前,支持各不相同。GCC 9.1支持使用TBB(因此需要安装并链接TBB才能工作)。