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 <algorithm>
了吗?
是的,我做了,我有点难过。我不能使用你的第二种方法,因为我正在编写的 c++ 版本会引发错误。【参考方案2】:
使用 bind1st 和 bind2nd(在 C++11 中我们只使用 bind)作为 也将 maxVol 作为其输入之一的谓词
创建一个函数对象,它可以有一个 maxVol 的成员变量。 重载 operator() 并将其作为谓词传入。
使用 boost lambda。【讨论】:
以上是关于lambda 函数 C++ 11的主要内容,如果未能解决你的问题,请参考以下文章