読者です 読者をやめる 読者になる 読者になる

イテレータループのマクロ

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) {
 ・
 ・
 ・
}