所謂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
黑色天使 閱讀(168)
評論(0) 編輯 收藏 引用