Boost库之lambda的使用



在C++引入Boost库的lambda之前,许多编程语言,比如Lisp、Python和C#中就已经有了lambda。Boost库创建lambda的最初动机,是为了解决使用标准库时存在大量小的函数对象的定义的问题。而实际上,我们完全可以在需要使用这些函数对象的时候进行声明和定义,即就地进行。lambda库通过创建一个匿名的lambda表达式来代替实名的函数对象,大大简化了标准库的语法。

下面我们来看一个hello world级的lambda表达式:

  (cout << _1 << " " << _3 << " " << _2)("Welcome"," cnblog ","to");

其中,_1、_2和_3称为占位符,用以表示第几个参数。

在“Boost库之bind的使用”一文中,我们用bind实现了找出一个整数容器中大于5但小于10的元素的个数,现在我们尝试用lambda来完成这项工作。

  int nCount = count_if(vctTemp.begin(), vctTemp.end(), _1>5 && _1<10);

可以看到,相对于使用bind进行函数对象的绑定,使用lambda使得语法更显简洁,逻辑也更觉清晰。

在lambda表达式中,还有一个非常重要的概念就是常量和变量的延迟,举例如下:

for_each(vctTemp.begin(),vctTemp.end(), cout << ‘ ‘ << _1);

该函数的本意是想在输出每一元素前都加一个空格,但由于cout << ‘ ‘不是一个lambda表达式,因此,它会被立即输出求值。为了实现延迟输出的目的,我们需要使用constant函数,以创建一个lambda仿函数。

for_each(vctTemp.begin(),vctTemp.end(), cout << constant(‘ ‘) << _1);

以上是常量延迟调用的例子,下面来看一下变量的延迟调用。

int nIndex = 0;

for_each(vctTemp.begin(),vctTemp.end(), cout << ++nIndex << _1<<endl);

同理,由于cout << ++nIndex不是一个lambda表达式,它只会被求值一次。为了在每次调用时都能输出序号,需要使用var函数,以创建一个lambda仿函数。

for_each(vctTemp.begin(),vctTemp.end(), cout << ++var(nIndex) << _1<<endl);

另外,还可以将一个lambda表达式赋给一个function,从而实现延迟调用。

  function<void (int, int)> fAdd = cout << _1 << "+" << _2 << "=" <<_1+_2 << endl;

  fAdd (1,2);

  fAdd (3,4);

以上介绍了lambda库的一些基本功能。lambda库的更强大之处在于,它提供了一些用于控制结构的函数模板,比如:if_then、if_then_else、if_then_else_return、while_loop、do_while_loop、for_loop、switch_statement等。下面以if_then_else为例,介绍其用法。

  for_each(vctTemp.begin(),vctTemp.end(),if_then_else(_1%2==0,cout<<_1<< ‘\n‘,cout<<constant("odd")<< ‘\n‘));

转载     http://www.cnblogs.com/hujian/archive/2009/06/22/1508075.html

如有版权问题,请联系QQ:    858668791

时间: 2024-08-30 16:33:38

Boost库之lambda的使用的相关文章

VS2008下直接安装使用Boost库1.46.1版本号

Boost库是一个可移植.提供源码的C++库,作为标准库的后备,是C++标准化进程的发动机之中的一个. Boost库由C++标准委员会库工作组成员发起,当中有些内容有望成为下一代C++标准库内容.在C++社区中影响甚大,是不折不扣的“准”标准库. Boost因为其对跨平台的强调,对标准C++的强调,与编写平台无关.大部分boost库功能的使用仅仅需包含对应头文件就可以,少数(如正則表達式库,文件系统库等)须要链接库.但Boost中也有非常多是实验性质的东西,在实际的开发中有用须要慎重.boost

Boost库编译安装

一.Boost库介绍         Boost库是一个经过千锤百炼.可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一.Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成为下一代C++标准库内容.在C++社区中影响甚大,其成员已近2000人. Boost库为我们带来了最新.最酷.最实用的技术,是不折不扣的“准”标准库. Boost库中比较有名的几个库: (1)Regex,正则表达式库: (2)Spirit,LL parser framework,用C

《超越C++标准库:Boost库导引》:序

序(Foreword) C++社区正在发生着一些美妙的事情.尽管C++仍然是世界上使用最广泛的编程语言,它依旧在变得更加强大而且易用.不信么?容我慢慢道来. 当前版本的标准C++是在1998年最终确定下来的,它为传统的过程式编程(procedural programming)以及面向对象和泛型编程(generic programming)提供了强有力的支持.正如老的(1998年以前的)C++单枪匹马地把面向对象引入软件开发者日常工作可及的范围那样,C++98针对泛型编程做了同样的事情.1990年

(六)boost库之内存管理shared_ptr

(六)boost库之内存管理shared_ptr 1.shared_ptr的基本用法 boost::shared_ptr<int> sp(new int(10)); //一个指向整数的shared_ptr assert(sp.unique()); //现在shared_ptr是指针的唯一持有者 boost::shared_ptr<int> sp2 = sp; //第二个shared_ptr,拷贝构造函数 assert(sp == sp2 && sp.use_coun

(十)boost库之多线程

(十)boost库之多线程 1.创建线程 使用boost库可以方便的创建一个线程,并提供最多支持9个参数的线程函数,相对于void*来说,方便了很多,创建线程主要提供了一下3种方式: 线程库头文件:#include <boost/thread.hpp> a.使用全局函数作为线程执行体 void Func(int nCount) { for (int i = 0; i < nCount; i++) { cout << __FUNCTION__ << i <&l

Boost库安装与使用

Boost 库非常不错,所以我今天就安了它一下下. Boost 库不是 C++ 标准库的一部分(据说在下一版本号的 C++ 标准会採纳它),但它有一些标准库所没有的非常实用的一些功能,比方我非常须要的正則表達式( Regular Expression) .所以我今天就在 GCC 上安装这个东东.(好像 GCC 也自带 Regex 库,我没有太注意) 先从 Boost .org 上 Download 一个 Boost 版本号的 tar.gz 包, boost ×××.tar.gz 然后 tar -

VS2008下直接安装Boost库1.46.1版本号

Boost图书馆是一个移植.提供源代码C++库.作为一个备份标准库,这是C++发动机之间的一种标准化的过程. Boost图书馆由C++图书馆标准委员会工作组成员发起,一些内容有望成为下一代C++标准库内容. 在C++甚大,是不折不扣的“准”标准库. Boost因为其对跨平台的强调,对标准C++的强调.与编写平台无关.大部分boost库功能的使用仅仅需包含对应头文件就可以.少数(如正則表達式库,文件系统库等)须要链接库. 但Boost中也有非常多是实验性质的东西,在实际的开发中有用须要慎重.boo

Boost库之function的使用

 Boost库的function是一组函数对象包装类的模板,实现了一个泛型的回调机制.Boost库的function与函数指针相比,优点在于它允许用户在目标的实现上拥有更大的弹性,即目标既可以是普通函数(自由函数),也可以是函数对象和类成员函数,而且可以给函数添加状态. 使用Boost库的function,可以很好地与现有的代码融合在一起.另外,function还可以与Boost库的bind和lambda配合使用,从而极大地扩展了function的适用范围.function库支持的函数参数个

所有的 Boost 库文档的索引

按字母顺序列出的库 按类别列出的库 算法 破碎的编译器的解决方法 并发编程 容器 正确性和测试 数据结构 特定于域的 函数对象和高阶编程 泛型编程 图像处理 输入/输出 跨语言支持 迭代器 语言功能仿真 数学和数字 内存 解析 模式和习语 预处理器元编程 编程接口 状态机 字符串和文本处理 系统 模板元编程 杂项 图书馆从提高退休 请参阅入门页面以了解如何下载. 构建和安装库. 按字母顺序列出的库 蓄能器-增量计算和统计累加器,Eric Niebler 从集合框架 算法-有用的通用算法,从马歇尔