在TBB parallel_for循环中获取迭代器

时间:2016-07-06 10:36:39

标签: c++ iterator c++14 tbb

我遇到了概念上简单的代码问题。我需要从循环内的向量中收集一些迭代器,我想使用TBB功能来并行化这个循环。这是一个最小的(不是)工作示例:

#include <tbb/tbb.h>

#include <vector>

int main()
{
    std::vector<int> v{1,2,3,4,5,6,7,8};
    tbb::concurrent_vector<decltype(v)::iterator> cv;
    tbb::parallel_for(std::begin(v), std::end(v), [&](const auto& iter)
    {
        cv.emplace_back(iter);
    });
}

如您所见,我对迭代器感兴趣,而不是值。我可以使用指针或引用包装器完成类似的事情(这里是一个例子),但我想了解我无法做我想做的事情......

#include <tbb/tbb.h>

#include <vector>

int main()
{
    std::vector<int> v{1,2,3,4,5,6,7,8};
    tbb::concurrent_vector<std::reference_wrapper<decltype(v)::value_type>> cv;
    tbb::parallel_for_each(std::begin(v), std::end(v), [&](auto& element)
    {
        cv.emplace_back(std::ref(element));
    });
}

1 个答案:

答案 0 :(得分:3)

您正尝试使用以下parallel_for重载:

template <typename Index, typename Function>
void parallel_for(Index first, Index last, const Function& f);

此重载需要两个索引来指定块范围。必须将Index类型转换为整数,以便在函数体中,即您指定的lambda,可以使用v[index]来访问(索引)向量的元素。

但是,您将迭代器传递给此重载,并且编译器无法将这些迭代器转换为整数,因此您收到了错误。

解决方案如下:

tbb::parallel_for(static_cast<std::size_t>(0), v.size(), // use index to specify the range
    [&](std::size_t index) {
        cv.emplace_back(v.begin() + index);  // access element with v[index]
    });