イテレータループのマクロ
C++では例えば以下のようなイテレータを使ったループをよく書くわけですが、
for (std::vector<std::string>::iterator it=vec.begin();it!=vec.end();++it) {
・
・
・
}
なんだか長いので、以下のようにtypedefを使ってちょっとでも短くしたくなります。
typedef std::vector<std::string>::iterator strVecIter;
for (strVecIter it=vec.begin();it!=vec.end();++it) {
・
・
・
}
それでもやっぱり長いので、最近は以下のようなマクロを書いて使ってます。
#define LoopIter(Iter, IterVar, Sequence) Iter IterVar=Sequence.begin();IterVar!=Sequence.end();++IterVar
for (LoopIter(strVecIter, it, vec)) {
・
・
・
}
std::for_eachでも出来ないことはないですが、その場合、いちいち関数(オブジェクト)作成しなきゃいけないですし、関数オブジェクト自体はあんまり大きくしたくないので、ループの中身が長くなってくると、そのループ用の関数(オブジェクト)を作るのはちょっと憚られます。
と、ここまで書いてboost::foreach使えよという声が聞こえてきた。
BOOST_FOREACH(std::string& e, vec) { ・ ・ ・ }