忍者ブログ

神戸電子専門学校ゲームソフト学科の生徒が運営するGESのブログです。

   

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

BOOST_FOREACH,C++,2・3年向け

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

NAME
TITLE
MAIL(非公開)
URL
EMOJI
Vodafone絵文字 i-mode絵文字 Ezweb絵文字
COMMENT
PASS(コメント編集に必須です)
SECRET
管理人のみ閲覧できます

ブログ内検索

最新コメント

[01/29 人面犬]
[10/01 8ch]
[09/12 uncle]
[09/10 某卒業生]
[06/07 uncle]

カレンダー

10 2024/11 12
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

テスト

Copyright ©  -- GESブログ --  All Rights Reserved
Design by CriCri / Photo by Geralt / powered by NINJA TOOLS / 忍者ブログ / [PR]