サンプルの動作確認バージョン [GCC4.4/1.41.0] [VC9/1.41.0]
#include <iostream>
#include <boost/foreach.hpp>
using namespace std;
int main()
{
int array[] = {1,2,3,4,5};
BOOST_FOREACH( int& e, array )
if( e%2 == 0 )
e = 0;
BOOST_FOREACH( int e, array )
{
cout << e << endl;
}
}
1 0 3 0 5
百聞は一見にしかずといいますが、上のサンプルコードがすべてですね。
配列やコンテナの要素すべてを順に処理するループを簡単に書くためのマクロです。 正確には、Range として扱える物すべての上をループできます。 多重ループ、breakやcontinue、例外等によるループ脱出、中括弧の省略その他諸々、 完全にforやwhileループと同じように扱えます。
#define foreach BOOST_FOREACH
しちゃえば更にかっこいい感じになります。
ただし一つだけ落とし穴があって、マクロとして定義されているので、 型に , が含まれている場合上手く行きません。
vector< pair<int,int> > v;
BOOST_FOREACH(pair<int,int> e, v) { ... } // エラー!!!
型の途中の , がマクロの引数区切りと解釈されてしまうためです。 このような場合は、仕方がないので typedef で別名をつけて使います。
vector< pair<int,int> > v;
typedef pair<int,int> elem_t;
BOOST_FOREACH(elem_t e, v) { ... } // OK