std::for_eachを使うと,コンテナに対するループがちょっとカッコよく書けます.
#include <iostream> #include <algorithm> #include <vector> void pred(int x){ std::cout << x << std::endl; } int main(){ std::vector<int> v; for(int i=0;i<10;i++) v.push_back(i); std::for_each(v.begin(), v.end(), pred); return 0; }
こんな感じ.このとき,for_eachの第3引数は,関数オブジェクトでもOK.
#include <iostream> #include <algorithm> #include <vector> struct pred_t{ void operator()(int x){ std::cout << x << std::endl; } } pred; int main(){ std::vector<int> v; for(int i=0;i<10;i++) v.push_back(i); std::for_each(v.begin(), v.end(), pred); return 0; }
こんな感じ.でもこれだと,使う場所(for_each)の場所と,定義する場所(struct定義してる場所)とが離れすぎて気持ち悪い.あとpred_tとか無駄に名前増えて気持ち悪い.で,さっきひらめいて,ローカルに,無名で構造体作ったらいけるんじゃないかと思って書いてみた.
#include <iostream> #include <algorithm> #include <vector> int main(){ std::vector<int> v; for(int i=0;i<10;i++) v.push_back(i); struct{ void operator()(int x){ std::cout << x << std::endl; } } pred; std::for_each(v.begin(), v.end(), pred); return 0; }
文法的には間違ってないと思うのに.これは動きません.テンプレートの引数に,ローカルで定義された構造体は渡せないらしい.さらに,無名構造体も渡せないらしい.
将来的(いわゆるC++0xと呼ばれるバージョン)では,ラムダ式が書けるようになるのでいいけど,現状は一番上の関数ポインタ渡しが一番楽か.
はじめまして。
C++0xはいつになるかわからないので(笑、現状ではboost::lambdaがベストな選択だと思ってます。
もちろんboostがインストールされてないとダメですが…。
#include <iostream>
#include <algorithm>
#include <vector>
#include <boost/lambda/lambda.hpp>
int main(){
using namespace boost::lambda;
std::vector<int> v;
for(int i=0;i<10;i++) v.push_back(i);
std::for_each(v.begin(), v.end(), (std::cout << _1 << '\n'));
return 0;
}
やっぱ現状ではこれですよね.
でもこの _1 が嫌いなんですよね….
可読性的にも.
C++やめたい…といいつつも使っている現状.