所謂Lambda,簡(jiǎn)單的說(shuō)是快速的小函數(shù)生成.
在STL的算法中很多地方需要提供一個(gè)函數(shù)對(duì)象或仿函數(shù)如for_each
for_each(v.begin(), v.end(), op()); //原格式如此
如果需要不用的算法就需要些不同的函數(shù)對(duì)象,但是引用了萬(wàn)能的lambda后效果就不同了,效果如下
for_each(v.begin(), v.end(), _1=2); //_1=2是一個(gè)仿函數(shù),通過(guò)重載=實(shí)現(xiàn)
需要的操作一目了然,簡(jiǎn)單分析下for_each第三個(gè)參數(shù)需要的是一個(gè)函數(shù)或仿函數(shù),所以_1=2必然產(chǎn)生的是一個(gè)仿函數(shù),大致可以推出是重載了=實(shí)現(xiàn)的產(chǎn)生仿函數(shù),那么真正的操作還需要一個(gè)封裝,即需要兩個(gè)類(lèi)實(shí)現(xiàn),第一個(gè)類(lèi)大致如下
struct place_holder
{
//重載需要的算法操作
template <typename R>
op<R> operator=(R i)
{
return op<R>(i);
}
};
模板使得這個(gè)結(jié)構(gòu)可以傳入任何類(lèi)型的參數(shù),通過(guò)重載=操作內(nèi)部返回了一個(gè)仿函數(shù),具體的操作由一下的仿函數(shù)實(shí)現(xiàn)
//仿函數(shù),即重載了()操作的類(lèi)
template <typename T>
struct op
{
op(T i): _i(i) {}
T operator()(T &i)
{
return i = _i;
}
T _i;
};
這個(gè)仿函數(shù)將傳入的引用參數(shù)進(jìn)行了賦值操作,實(shí)現(xiàn)了最終的操作.
以上的代碼實(shí)現(xiàn)=操作如果需要其他操作則重載相應(yīng)的操作例如+=
依次類(lèi)推占位類(lèi)實(shí)現(xiàn)+=并通過(guò)仿函數(shù)可以實(shí)現(xiàn)+=的操作以下是完成的代碼
// lambda.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。
//
#include "stdafx.h"
#include <vector>
#include <algorithm>
using namespace std;
//仿函數(shù),即重載了()操作的類(lèi)
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是一個(gè)仿函數(shù),通過(guò)重載=實(shí)現(xiàn)
return 0;
}
posted on 2011-03-22 18:30
黑色天使 閱讀(168)
評(píng)論(0) 編輯 收藏 引用