2016-07-06 104 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