vector< int> vec; /// 1. simple lambda auto it = std::find_if(vec.begin(), vec.end(), [](int i) { return i > 50; });
class A { public: bool operator(int i) const { return i > 50; } }; auto it = std::find_if(vec.begin(), vec.end(), A()); /// 2. lambda return syntax std::function< int(int)> square = [](int i) -> int { return i * i; } /// 3. lambda expr: capture of local variable { int min_val = 10; int max_val = 1000; auto it = std::find_if(vec.begin(), vec.end(), [=](int i) { return i > min_val && i < max_val; }); auto it = std::find_if(vec.begin(), vec.end(), [&](int i) { return i > min_val && i < max_val; }); auto it = std::find_if(vec.begin(), vec.end(), [=, &max_value](int i) { return i > min_val && i < max_val; }); } /// 4. lambda expr: capture of class member class A { public: void DoSomething(); private: std::vector<int> m_vec; int m_min_val; int m_max_va; }; /// 4.1 capture member by this void A::DoSomething() { auto it = std::find_if(m_vec.begin(), m_vec.end(), [this](int i){ return i > m_min_val && i < m_max_val; }); } /// 4.2 capture member by default pass-by-value void A::DoSomething() { auto it = std::find_if(m_vec.begin(), m_vec.end(), [=](int i){ return i > m_min_val && i < m_max_val; }); } /// 4.3 capture member by default pass-by-reference void A::DoSomething() { auto it = std::find_if(m_vec.begin(), m_vec.end(), [&](int i){ return i > m_min_val && i < m_max_val; }); }
上面的例子基本覆盖到了lambda表达的基本用法。我们一个个来分析每个例子(标号与上面代码注释中1,2,3,4一致):
分析完了上面的例子,我们来总结一下关于lambda表达式使用时的一些注意事项:
通过上面的介绍,我们基本了解了function, bind和lambda的用法,把三者结合起来,C++将会变得非常强大,有点函数式编程的味道了。最后,这里再补充一点,对于用bind来生成function和用lambda表达式来生成function, 通常情况下两种都是ok的,但是在参数多的时候,bind要传入很多的std::placeholders,而且看着没有lambda表达式直观,所以通常建议优先考虑使用lambda表达式。
closure是一个函数和它所引用的非本地变量的上下文环境的集合。从定义我们可以得知,closure可以访问在它定义范围之外的变量,也即上面提到的non-local vriables(非局部变量),这就大大增加了它的功力。关于closure的最重要的应用就是回调函数
原文:http://www.cnblogs.com/kex1n/p/7072139.html