トップページ > 関数型プログラミング >
サンプルの動作確認バージョン [GCC4.4/1.40.0] [VC9/1.40.0]
#include <iostream>
#include <vector>
#include <algorithm>
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/if.hpp>
using namespace std;
int main()
{
using namespace boost::lambda;
vector<int> vec;
vec.push_back(10);
vec.push_back(23);
vec.push_back(45);
vec.push_back(76);
vec.push_back(98);
// 5で割り切れて30より大きい要素を探す。
vector<int>::iterator it =
find_if( vec.begin(), vec.end(), _1%5==0 && _1>30 );
cout << "found:" << *it << endl;
// それぞれの要素について、
// 2で割り切れるかそうでないかによってメッセージを表示。
std::for_each( vec.begin(), vec.end(),
if_( _1 % 2 == 0 )[
cout << _1 << "は偶数\n"
].else_[
cout << _1 << "は奇数\n"
]
);
return 0;
}
found:45 10は偶数 23は奇数 45は奇数 76は偶数 98は偶数
最初の例は要するに、
bool f( int _1 )
{
return _1%5==0 && _1>30;
}
...
find_if( vec.begin(), vec.end(), f );
と同じ事で、2番目の例は
void g( int _1 )
{
if( _1 % 2 == 0 ){
cout << _1 << "は偶数\n"
}else{
cout << _1 << "は奇数\n"
}
}
...
for_each( vec.begin(), vec.end(), g );
です。名無しの関数を行の中にワシワシと書き込んで即席で作ってしまうわけですね。 ここまで来るともはやC++に見えなくなってきますが、 頭の体操になってなかなか面白いです。
しかし例えば bind2nd( less<int>(), 10 )
と書くより
_1 < 10
と書いた方が遙かに可読性があがることを考えると、
簡単な処理にであれば実際にマジメに使ってみるのも便利かと思います。
このページではlambdaのもっとも簡単な使い方だけサンプルとして提示しましたが、 ループやswitch、例外処理、2変数以上の関数作成など、 ほぼ全機能を網羅したサンプルとして次のページがおすすめです。
また、ラムダ的処理の実装方法が気になる方は、 私が最初のとっかかりだけをちょびっと実装したものがありますので、 よろしければご覧下さい。