lambda 函数 C++ 11

Posted

技术标签:

【中文标题】lambda 函数 C++ 11【英文标题】:lambda function c++ 11 【发布时间】:2014-04-06 17:31:10 【问题描述】:

知道如何在 c++11 之前重写这个 lambda 函数吗?

    if (maxVol != 0)
       std::transform(&spec[0], &spec[sampleSize], &spec[0]
                     , [maxVol] (float dB) -> float    return dB / maxVol; );

代码来自http://katyscode.wordpress.com/2013/01/16/cutting-your-teeth-on-fmod-part-4-frequency-analysis-graphic-equalizer-beat-detection-and-bpm-estimation

谢谢

【问题讨论】:

【参考方案1】:

原码:

if (maxVol != 0)
       std::transform(&spec[0], &spec[sampleSize], &spec[0], [maxVol] (float dB) -> float    return dB / maxVol; );

拉姆达:

[maxVol] (float dB) -> float    return dB / maxVol; 

替换 lambda:

struct percent_of 
    //that lambda captures maxVol by copy when constructed
    percent_of(float maxVol) : maxVol(maxVol)  
    //the lambda takes a "float dB" and returns a float
    float operator()(float dB) const  return dB / maxVol; 
private:
    float maxVol;
;

完整代码替换:

if (maxVol != 0)
       std::transform(&spec[0], &spec[sampleSize], &spec[0], percent_of(maxVol));

但是,这个 lambda 非常简单,现在它已内置到标准库中。 Pre-C++11 在boost 中有这些完全相同的位。

if (maxVol != 0) 
    using std::placeholders::_1;
    auto percent_of = std::bind(std::divides<float>(), _1, maxVol);
    std::transform(&spec[0], &spec[sampleSize], &spec[0], percent_of);

【讨论】:

我收到错误消息:'FrequencyAnalysis::DrawScene()::percent_of' 没有任何名为 'maxVol' 的字段,并且使用了包含函数的 'auto' 变量。它也不识别 std::transform 中的函数。任何帮助将不胜感激,谢谢。 第一个是由maxVol 名称中的拼写错误引起的,第二个是由于忘记实际实例化divides。我已经纠正了这些。第三个错误仅源于前两个错误,但代码现在可以正常工作,而不仅仅是指导。 coliru.stacked-crooked.com/a/8d8b42fa15ad94ba 对不起,我仍然得到错误:'没有匹配函数调用'transform(float*, float *, float *, FrequencyAnalysis::DrawScene()::percent_of)' #include &lt;algorithm&gt;了吗? 是的,我做了,我有点难过。我不能使用你的第二种方法,因为我正在编写的 c++ 版本会引发错误。【参考方案2】:

    使用 bind1st 和 bind2nd(在 C++11 中我们只使用 bind)作为 也将 maxVol 作为其输入之一的谓词

    创建一个函数对象,它可以有一个 maxVol 的成员变量。 重载 operator() 并将其作为谓词传入。

    使用 boost lambda。

【讨论】:

以上是关于lambda 函数 C++ 11的主要内容,如果未能解决你的问题,请参考以下文章

C++ 11 lambda表达式

都什么年代了,还不会C++的Lambda函数?

c++中lambda表达式用法

c++ 类在构造函数中使用 lambda

c++ lambda表达式与函数对象

C ++中的Lambda函数,参数和逻辑[重复]