C++ 编译错误的TBB并行_

C++ 编译错误的TBB并行_,c++,templates,c++11,tbb,C++,Templates,C++11,Tbb,我想使用TBB parallel_,因为我在测试代码时使用了它 #include <tbb/parallel_for.h> #include <tbb/blocked_range.h> #include <tbb/tbb.h> std::vector<std::tuple<std::string, unsigned int, std::string>> commands; auto n = commands.size(); tbb::

我想使用TBB parallel_,因为我在测试代码时使用了它

#include <tbb/parallel_for.h>
#include <tbb/blocked_range.h>
#include <tbb/tbb.h>

std::vector<std::tuple<std::string, unsigned int, std::string>> commands;
auto n = commands.size();
tbb::parallel_for(0, n, [&](int i) {
    const auto &tuple = commands[i];
} );
我的编译器错误是:

TextMiningApp.cpp: In function ‘int main(int, char**)’:
TextMiningApp.cpp:184:7: error: no matching function for call to ‘parallel_for(int, long unsigned int&, main(int, char**)::<lambda(int)>)’
     } );
       ^
In file included from TextMiningApp.cpp:15:0:
/usr/include/tbb/parallel_for.h:185:6: note: candidate: template<class Range, class Body> void tbb::parallel_for(const Range&, const Body&)
 void parallel_for( const Range& 
      ^
TextMiningApp.cpp:在函数“int main(int,char**)”中:
TextMiningApp.cpp:184:7:错误:调用“parallel_for(int,long unsigned int&,main(int,char**):)”时没有匹配的函数
} );
^
在TextMiningApp.cpp:15:0中包含的文件中:
/usr/include/tbb/parallel_for.h:185:6:注:候选:模板void tbb::parallel_for(常量范围和常量主体和)
空平行_(常数范围和
^

你有办法解决这个问题吗?

你的代码的问题是
0
的类型是
int
,而
n
的类型是
std::size\u t
。存在不匹配,需要进行转换。解决方案如下:

tbb::parallel_for(static_cast<std::size_t>(0), n, [&](std::size_t i)) {
    // other code    
}

显然,第一个解决方案更简洁。但是,第二个解决方案更灵活。因为对于第一个解决方案,您只能指定循环体,而对于第二个解决方案,您可以在循环体之外执行更多操作。

代码的问题是
0
类型为
int
,而
n
类型为
std::size\u t
。存在不匹配,需要进行转换。解决方案如下:

tbb::parallel_for(static_cast<std::size_t>(0), n, [&](std::size_t i)) {
    // other code    
}

显然,第一种解决方案更简洁。但是,第二种解决方案更灵活。因为对于第一种解决方案,您只能指定循环体,而对于第二种解决方案,您可以在循环体之外执行更多操作。

谢谢命令不是空的,我只是删除了代码。在lamda中仍然有for?所以并行for只需给您一个小的r范围?对于我的代码,本教程的代码无效?本教程有效。我通常使用
tbb::blocked_range
界面,而忽略了另一个界面。我已更新了答案。对于由此带来的不便,我深表歉意。再次感谢@for_stack,什么更好(或更高性能)呢解决方案?“index”重载最终调用“blocked_range”重载来完成实际工作。它们应该具有相同的性能。显然,“index”重载更简洁。但是,“blocked_range”重载更灵活。“index”重载的lambda只是循环体,而“重载”版本的lambda可以在循环体之外做更多的事情。谢谢命令不是空的,我只是删除了代码。在lamda中仍然有for?所以并行for只是给你一个较小的范围?对于我的代码,本教程有无效的代码?本教程是有效的。我通常使用
tbb::blocked_range
接口,而忽略了另一个。我已经更新了an答:很抱歉给您带来不便。再次感谢@for_stack,什么更好(或性能更好)解决方案?“index”重载最终调用“blocked_range”重载来完成实际工作。它们应该具有相同的性能。显然,“index”重载更简洁。但是,“blocked_range”重载更灵活。“index”重载的lambda只是循环体,而“重载”版本的lambda可以在循环体之外执行更多操作。
tbb::parallel_for(tbb::blocked_range<std::size_t>(0, n),
    [&](const tbb::blocked_range<std::size_t> &range) {
        for (auto i = range.begin(); i != range.end(); ++i)
            const auto &tuple = commands[i];
    } );