BOOST_FOREACHはSTLのコンテナをイテレータなどを宣言せずに、コンテナに入っている値を操作できます。
std::list<MyClass>::iterator it=MyList.begin();
のようなイテレータの宣言は不要になりスマートに記述できます。
boostって? boostの入れ方は?
などはこちらの
補足へ
[0回]
// コピってもらえれば 実行できます
#include <stdio.h>
#include <list>
#include <boost/foreach.hpp>
struct MyClass
{
void print(){ printf("%d\n",m_a);}
int m_a;
};
void main()
{
std::list<MyClass> MyList;
// 適当なオブジェクトをリストに入れます
for( int i=0 ; i<10 ; ++i)
{
MyClass tmp;
tmp.m_a=i;
MyList.push_back(tmp);
}
//普通のイテレータを宣言して回す方法
std::list<MyClass>::iterator it;
for( it=MyList.begin() ; it!=MyList.end() ; ++it )
{
(*it).print();
}
// BOOST_FOREACH
BOOST_FOREACH(MyClass tmp,MyList)
{
tmp.print(); // tmpがイテレータの代わりになってる!
}
}
BOOST_FOREACHを用いることでスマートな記述になりました。
内部では、
#define BOOST_FOREACH(VAR,COL) 「for(~すごい長い分~){ 」
のように定義されていました。 ( VAR=value ・ COL=collection の意味 )
BOOST_FOREACHのページです。
http://www.kmonos.net/alang/boost/classes/foreach.html
このページのサンプルにはコンテナを扱っていないので、あまり参考になりませんが
BOOST_FOREACHで扱えるRangeという概念を勉強できます。
BOOST_FOREACHは強力ですが、
begin~end の範囲を
全探索してしまうので、
「次の指してる要素に行きたい」の要望は叶えられません。例えば、
CMenuという項目用のクラスをリストで保持している時、キーボードを押されたら
++m_itNowSelect; // 次の項目に行く
if( m_itNowSelect==m_MenuList.end() )
{
m_itNowSelect==m_MenuList.begen(); // 一番最後の項目にきたら一番上を指す
}
のような事はできなくなります。
メリット・デメリットをよく考えて使っていきましょう。
情報に誤りなどがあったらご指摘願います。
byリーダ和田
PR
COMMENT