C ++ 11 for_each传递多个值

时间:2014-05-09 21:05:13

标签: c++ c++11

我有以下方法:

CalculateThreshold(std::vector<double> &data, int thres)
{
  // include functionality 
}

然后我有一个向量的向量,我想使用std::for_each进行迭代,我尝试使用以下内容:

std::for_each(
   std::begin(results),
   std::end(results), 
   std::bind2nd(std::mem_fun(&CalculateThres), 1)); 

但我不断收到错误消息:

  

注意:候选人是模板std :: mem_fun_t&lt; _Ret,_Tp&gt; std :: mem_fun(_Ret(_Tp :: *)())

有人建议我哪里出错了吗?对我来说,这应该有效!

2 个答案:

答案 0 :(得分:7)

只需使用std::bind,就不需要std::mem_fun(如评论中所述)。

std::for_each(
   std::begin(results),
   std::end(results), 
   std::bind(CalculateThres, std::placeholders::_1, 1)); 

此外,不推荐bind1stbind2nd,您应该使用bind。同样,mem_fun也已弃用,其替换为mem_fn

答案 1 :(得分:6)

让我们更仔细地看一下编译器所说的内容,特别是那部分:

std::mem_fun_t<_Ret, _Tp> std::mem_fun(_Ret (_Tp::*)())

_Ret (_Tp::*)()表示指向成员函数的指针。您试图传递自由函数CalculateThreshold,因此这不起作用,类型不匹配。

此外,在C ++ 11中不推荐使用std::mem_funstd::bind2nd


你正在使用C ++ 11,所以你基本上有三个简单的解决方案:

  • 使用for range loop:

    for (auto && v : results)
        CalculateThreshold(v, 1);
    
  • std::bindstd::foreach

    一起使用
    std::foreach(std::begin(results), std::end(results),
                 std::bind(CalculateThreshold, std::placeholders::_1, 1));
    
  • 使用带std::foreach的lambda:

    std::foreach(std::begin(results), std::end(results),
                 [](std::vector<double> & data) { CalculateThreshold(data, 1); });