蜗牛的家
男儿当自强
posts - 48,  comments - 21,  trackbacks - 0
所谓Lambda,简单的说是快速的小函数生成.
在STL的算法中很多地方需要提供一个函数对象或仿函数如for_each
for_each(v.begin(), v.end(), op());    //原格式如此
如果需要不用的算法就需要些不同的函数对象,但是引用了万能的lambda后效果就不同了,效果如下
for_each(v.begin(), v.end(), _1=2);    //_1=2是一个仿函数,通过重载=实现
需要的操作一目了然,简单分析下for_each第三个参数需要的是一个函数或仿函数,所以_1=2必然产生的是一个仿函数,大致可以推出是重载了=实现的产生仿函数,那么真正的操作还需要一个封装,即需要两个类实现,第一个类大致如下
struct place_holder
{
    
//重载需要的算法操作
    template <typename R>
    op
<R> operator=(R i)
    {
        
return op<R>(i);
    }
};
模板使得这个结构可以传入任何类型的参数,通过重载=操作内部返回了一个仿函数,具体的操作由一下的仿函数实现
//仿函数,即重载了()操作的类
template <typename T>
struct op
{
    op(T i): _i(i) {}
    T 
operator()(T &i)
    {
        
return i = _i;
    }
    T _i;
};
这个仿函数将传入的引用参数进行了赋值操作,实现了最终的操作.
以上的代码实现=操作如果需要其他操作则重载相应的操作例如+=
依次类推占位类实现+=并通过仿函数可以实现+=的操作以下是完成的代码
// lambda.cpp : 定义控制台应用程序的入口点。
//

#include 
"stdafx.h"
#include 
<vector>
#include 
<algorithm>

using namespace std;

//仿函数,即重载了()操作的类
template <typename T>
struct op
{
    op(T i): _i(i) {}
    T 
operator()(T &i)
    {
        
return i = _i;
    }
    T _i;
};
template 
<typename T>
struct op1
{
    op1(T i):_i(i){}
    T 
operator()(T &i)
    {
        
return i + _i;
    }
    T _i;
};

//占位符
struct place_holder
{
    
//重载需要的算法操作
    template <typename R>
    op
<R> operator=(R i)
    {
        
return op<R>(i);
    }
    template 
<typename R>
    op1
<R> operator+=(R i)
    {
        
return op1<R>(i);
    }
};

place_holder _1;

int _tmain(int argc, _TCHAR* argv[])
{
    vector
<int> v;
    v.push_back(
1);
    v.push_back(
2);
    v.push_back(
3);

    
//for_each(v.begin(), v.end(), op());    //原格式如此
    for_each(v.begin(), v.end(), _1=2);    //_1=2是一个仿函数,通过重载=实现

    
return 0;
}


posted on 2011-03-22 18:30 黑色天使 阅读(164) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理



<2024年12月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

常用链接

留言簿(2)

随笔分类

随笔档案

文章档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜