Lambda Expressions in C++
2013-03-09 14:22
363 查看
关于Lambda表达式
许多编程语言提供了匿名函数,Lambda表达式是与匿名函数有关的编程方法。匿名函数就是一个只有函数实体,而没有函数名字的函数。Lambda表达式隐式的定义了一个函数对象类(有关函数对象简介),并且构造了一个该类的对象。可以把Lambda表达式看作是包含状态和可以访问封闭作用域外的变量的匿名函数。函数对象 VS Lambda表达式
我们有时候会用函数指针和函数对象来解决问题。函数指针和函数对象都有利也有弊。函数指针涉及最少的语法开销,比较简单。但它不能保存状态。
函数对象可以保存状态,但它需要定义一个类的语法开销。
而Lambda表达式吸取了函数指针和函数对象的优点,摒弃了它们的缺点。Lambda表达式像函数对象一样灵活并且可以持有状态,但是它的语法十分紧凑,不需要像函数对象一样去定义一个类。
下面是一个简单的例子(统计vector容器的偶数的个数),用来比较Lambda表达式和函数对象。
例子1,使用Lambda表达式:
#include <iostream> #include <algorithm> #include <vector> using namespace std; int main() { vector<int> vecInt; for(int i=0;i<10;i++) vecInt.push_back(i); int evenCount=0; for_each(vecInt.begin(),vecInt.end(),[&evenCount](int k){ cout<<k<<" "; if (k%2==0) { cout<<"偶数"<<endl; evenCount++; } else cout<<"奇数"<<endl; }); cout<<"偶数有 "<<evenCount<<" 个"<<endl; }运行结果:
上面的例子中,for_each的第三个参数就是一个Lambda表达式。关于Lambda的语法,在下一篇文章写。
例子2,使用函数对象:
#include <iostream> #include <algorithm> #include <vector> using namespace std; class Functor { public: Functor(int &ec):_evenCount(ec){} public: void operator()(int n) { cout<<n<<" "; if (n%2==0) { cout<<"偶数"<<endl; _evenCount++; } else cout<<"奇数"<<endl; } private: int &_evenCount; }; int main() { vector<int> vecInt; for(int i=0;i<10;i++) vecInt.push_back(i); int evenCount=0; for_each(vecInt.begin(),vecInt.end(),Functor(evenCount)); cout<<"偶数有 "<<evenCount<<" 个"<<endl; }上面的例子使用函数对象,和例子1中的Lambda表达式运行结果一样。
相关文章推荐
- Lambda Expressions in C++
- Understand Lambda Expressions in 3 minutes
- C++ AMP: The Concurrency Runtime and Visual C++ 2010: Lambda Expressions
- lambda in c++
- Recursive Lambda in C++
- Recursive Lambda in C++
- C++ AMP: The Concurrency Runtime and Visual C++ 2010: Lambda Expressions
- 什么是lambda expressions in java
- Recursive Lambda Expressions in C#
- Lambda Expressions in Java 8
- Understand Lambda Expressions in 3 minutes(翻译)
- C++ 11: lexical closure in lambda function, example 1
- Effective Modern C++ 笔记 第六章 Lambda Expressions
- How to Use Lambda Expressions in a Query
- C++ 0x 新特性(1):Lambda expressions
- The Usage of Lambda and Heap in the C++ STL
- Regular Expressions in C++ with Boost.Regex(1)
- Understand Lambda Expressions in 3 minutes(翻译)
- Regular Expressions in C++ with Boost.Regex(2)
- Regular Expressions in C++ with Boost.Regex(3)