[C++] Functor与lambda

* Functor中文翻译为仿函数。

* lambda与匿名函数密不可分。lambda本身隐式地定义了对应的函数对象类型(Functor Class)以及该类的对象(Functor object)。

Functor

特性

* 可包含状态。

* 可用作模板参数。

* 与函数指针相比,Functor语法复杂(需要定义一个类型),但可保存状态。lambda既可以保存状态,语法又够简洁。

demo

class FunctorAdd_X
{
     int _state; // 状态
public:
    FunctorAdd_X(int _s):_state(_s){} // 初始化状态
    int operator()(int y) const
    {
        return y+_state;
    }
};

void TestFunctor()
{
    FunctorAdd_X myAdd(10);
    int z = myAdd(1);
    cout << z << endl;
}

  

Lambda

1 lambda引入标志。[]中的=表示以值的方式捕获外部变量(只读),&表示以引用的方式捕获(可修改):

* []没有符号,表示不捕获。

* [&a] 以引用的方式捕获a。

* [=,&a] 默认以值捕获,但a以引用的方式捕获。

2 参数列表

3 mutable

4 异常标识

5 返回值

6 函数体

demo

void TestLambda()
{
      // 无返回值、无参数
    [](){cout << "I am in lambda." << endl;}();

    // 有参数,常量传递参数
    [](int x){cout << "x="<< x << endl;}(1);

    // 引用的方式传递参数
    int a=1;
    [](int& x){ cout << "change x to " << ++x << endl;}(a);
    cout << "after change,a=" << a << endl;

    // 值捕获,捕获的变量只读
    int b=1;
    [=](){cout << " b =" << b << endl;}();

    // 引用捕获
    int c=1;
    [&](){cout << " change c to " << ++c << endl;}();
    cout << c << endl;

    // 值捕获混合引用捕获
    int m=1;
    int n=2;
    [=,&n](){++n;/*++m*/;}();
    cout << "m,n="<<m<<","<<n<<endl;

    // 有返回值
    int d = []()->int{return 1;}();
    cout << "d = " << d << endl;

    // 有返回值,但不标出
    int e = [](){return 1;}();
    cout << "e = " << e << endl;

    // 定义一个类似匿名函数
    auto GetMax = [](int x,int y){ return x>y?x:y;};
    int f = GetMax(1,2);
    cout << "f = " << f << endl;
}

  

References

http://msdn.microsoft.com/zh-cn/library/vstudio/aa985932.aspx 函数对象

http://msdn.microsoft.com/zh-cn/library/vstudio/dd293608.aspx Lambda

http://stackoverflow.com/questions/7627098/what-is-a-lambda-expression-in-c11 Lambda expression

[C++] Functor与lambda

时间: 2024-10-13 15:17:02

[C++] Functor与lambda的相关文章

翻译:使用tbb实现特征检测的例子

A feature-detection example using the Intel® Threading Building Blocks flow graph By Michael V. (Intel), Added September 9, 2011 Translate Chinese Simplified Chinese Traditional English French German Italian Portuguese Russian Spanish Turkish Transla

推荐使用C++ 11

如果你的代码工作正常并且表现良好,你可能会想知道为什么还要使用C++ 11.当然了,使用用最新的技术感觉很好,但是事实上它是否值得呢? 在我看来,答案毫无疑问是肯定的.我在下面给出了9个理由,它们分为两类:性能优势和开发效率. 获得性能优势 理由1:move语义(move semantics).简单的说,它是优化复制的一种方式.有时候复制很显然是浪费的.如果你从一个临时的string对象复制内容,简单的复制指针到字符缓冲区将比创建一个新的缓冲区再复制要高效得多.他之所以能工作是因为源对象超出了范

C++面试小结

虚函数与纯虚函数: 引入虚函数是为了动态绑定,引入纯虚函数是为了派生接口 基类需要虚的析构函数的原因: 当derived class由一个base class指针被删除而该base class指针为non-virtual的时候,可能会发生内存泄漏,使用虚的析构函数可以解决该问题 ++i与i++的区别: //i++ 实现代码为: int operator++(int) { int temp = *this; ++*this; return temp; }// 返回一个 int 型的对象本身 //

Functional Programming without Lambda - Part 2 Lifting, Functor, Monad

Lifting Now, let's review map from another perspective. map :: (T -> R) -> [T] -> [R] accepts 2 parameters, a function f :: T -> R and a list list :: [T]. [T] is a generic type paramterized by T, it's not the same as T, but definitely shares s

【转载】C++ function、bind和lambda表达式

本篇随笔为转载,原贴地址:C++ function.bind和lambda表达式. 本文是C++0x系列的第四篇,主要是内容是C++0x中新增的lambda表达式, function对象和bind机制.之所以把这三块放在一起讲,是因为这三块之间有着非常密切的关系,通过对比学习,加深对这部分内容的理解.在开始之间,首先要讲一个概念,closure(闭包),这个概念是理解lambda的基础.下面我们来看看wikipedia上对于计算机领域的closure的定义: A closure (also le

【转帖】漫话C++0x(四) —- function, bind和lambda

实在是觉得此文总是去翻感觉不太好.于是果断转过来了,想看原文的请戳:http://www.wuzesheng.com/?p=2032 本文是C++0x系列的第四篇,主要是内容是C++0x中新增的lambda表达式, function对象和bind机制.之所以把这三块放在一起讲,是因为这三块之间有着非常密切的关系,通过对比学习,加深对这部分内容的理解.在开始之间,首先要讲一个概念,closure(闭包),这个概念是理解lambda的基础.下面我们来看看wikipedia上对于计算机领域的closu

函数指针,function,bind, lambda

函数指针,sd::function<type1, type2...> functionObject, std::bind() 1. 函数指针是类型不安全的,为什么? #include<stdio.h> int max(int x,int y){return (x>y? x:y);} int main() { int (*ptr)(int, int); int a, b, c; ptr = max; scanf("%d%d", &a, &b)

浅谈C++ Lambda 表达式(简称LB)

C++ 11 对LB的支持,对于喜欢Functional Programming的人来说,无疑是超好消息.它使得C++进入了和C#,JavaScript等现代流行的程序设计语言所代表的名人堂. 不熟悉LB本身的网友,可以看MSDN文章 ( http://msdn.microsoft.com/en-us/library/dd293608.aspx ),我仅仅简单地分析一下VC++中LB的用法,实现,和性能. 无名引用 对于一次性的,带参数表达式,用LB可以节省不必要的class定义和维护,简化程序

lambda函数

C++11一个最激动人心的特性是支持创建lambda函数(有时称为闭包).这意味着什么?一个Lambda函数是一个可以内联写在你代码中的函数(通常也会传递给另外的函数,类似于仿函数或函数指针).使用Lambda,创建机动函数会更简单,而以前你必须创建一个有名函数.在这篇文章中,我先用一些例子解释为什么lambda很酷,然后我会讲解可能会用到的关于lambda的所有细节. 为什么Lambda很酷 想象你有一个地址簿类,并且你想要提供一个可供检索的函数.你可能会提供一个简单的函数,接受一个字符串然后