2016-07-06 42 views
0

我遇到了一个概念上直接的代码问题。我需要从循环内的向量收集一些迭代器,并且我想使用TBB功能来并行化这个循环。这里有一个最小(不)的工作例子:在TBB中获取迭代器parallel_for循环

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

回答

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] 
    }); 
+0

是啊,你是绝对正确的。在文档里我错过了这个观点:'索引类型必须是一个整数类型'。说实话,我无法理解这个限制背后的原因。随机访问的迭代器能够与整数类型“结合”,它支持std :: less等等......但是,谢谢! – dodomorandi