码迷,mamicode.com
首页 > 其他好文 > 详细

STL函数对象和Lambda表达式

时间:2014-07-11 09:59:40      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:style   color   使用   文件   art   cti   

 

 STL函数对象和Lambda表达式

 

1.基本概念

Function object是定义了operator()的object。

FunctionObjectType fo;

fo(…);调用函数对象的operator()代替函数fo()的调用。

等价于:fo.operator()(…);

 

函数对象的三个好处

(1) 函数对象可以有自己的状态,因此可能是更聪明的。你可以拥有同一个函数对象的两个实例,它们可能有不同的状态。

(2) 每个函数对象是一个类型。你可以把函数对象作为模版的参数用于指定一个特定的行为。

(3)函数对象通常比函数指针更快。因为在编译时有更多的信息被定义。

 

2.函数对象有自己的状态,更smart

如执行加某个值:

(1) 普通函数,在编译时加10

void add10(int &elem)

{

     elem += 10; 
}

void f1()

{

     vector<int> ivec;

      …

     for_each(ivec.begin(), ivec.end(), add10);
}

(2) 若想在编译时加别的值,需要重写普通函数,可以使用函数模版

template <int Val>  //非类型模版形参:编译时常量

void add(int &elem)

{

      elem += Val;
}

void f1()

{

     vector<int> ivec;

    …

    for_each(ivec.begin(), ivec.end(),

                 add<10>);
}

  (3) 要想运行时加值可以用function object

  既可以加上常量如10,也可以加上一个变量(运行时才知道值)。

 

3.作为一个type,可以作为模版的参数,如作为sorting的排序准则

 

4.预定义的函数对象

头文件#include<functional>定义了一些函数对象:+ – * / == != < > <= >= ! && || & | ^。

注意:less<>是排序函数排序关联容器排序的默认准则

        equal_to<>unordered 容器的默认相等准则

 

5.Function Adapters

函数适配器是一个能够组合函数对象的函数对象

since C++11有:

  bind(op, args…);        //Binds args to op

mem_fn(op);       //Call op() 作为一个对象或者对象指针的成员函数。也可以&Class::memfun

not1(op);           //!op(param)

not2(op);     //!op(param1, param2)

  最重要的是bind(), 其他用处不大

  通常bind()可以绑定对像,使用std:placeholders(站位符):_1, _2传递实参

 

6.Lambda 表达式

函数对象更适合于在库中的使用,lambda更适合于应用程序更加直观。

 

STL函数对象和Lambda表达式,布布扣,bubuko.com

STL函数对象和Lambda表达式

标签:style   color   使用   文件   art   cti   

原文地址:http://www.cnblogs.com/hancm/p/3834536.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!