foreach
Problem
std::tr1::mem_fnやstd::tr1::bindを使わず、イテレータを使って自分でループ処理を書いてはいけませんか?
Solution
Algorithm vs Loopでも述べたように、ループ処理は極力避けることが望ましいです。
あなたは、「C++にも他のプログラミング言語のようなforeachステートメントがあれば良いのに」と思うかもしれません。
たしかにC++にはforeachステートメントはありませんが、boostにforeachステートメントを実装したライブラリBoost.Foreachがあります。
Boost.Foreachを使うと次のように書くことができます。
必要であればマクロを置き換えることで、ステートメントらしく見えるようになります。
std::pairにはループさせる範囲(Range)を[first, second)で指定します。
1. Boost.Foreach
std::tr1::mem_fnやstd::tr1::bindを使わず、イテレータを使って自分でループ処理を書いてはいけませんか?
Solution
Algorithm vs Loopでも述べたように、ループ処理は極力避けることが望ましいです。
あなたは、「C++にも他のプログラミング言語のようなforeachステートメントがあれば良いのに」と思うかもしれません。
たしかにC++にはforeachステートメントはありませんが、boostにforeachステートメントを実装したライブラリBoost.Foreachがあります。
Boost.Foreachを使うと次のように書くことができます。
#include <list>
#include <boost/foreach.hpp>
class Widget {
public:
void test(int n) {}
};
int main()
{
std::list<Widget*> lspw;
BOOST_FOREACH(Widget* pw, lspw) {
pw->test(0);
}
return 0;
}
BOOST_FOREACHはマクロなので一見、ステートメントには見えません。必要であればマクロを置き換えることで、ステートメントらしく見えるようになります。
#include <list>
#include <boost/foreach.hpp>
#define foreach BOOST_FOREACH
class Widget {
public:
void test(int n) {}
};
int main()
{
std::list<Widget*> lspw;
foreach(Widget* pw, lspw) {
pw->test(0);
}
return 0;
}
また、BOOST_FOREACHは標準コンテナだけでなく、配列やstd::pairに対しても使用可能です。std::pairにはループさせる範囲(Range)を[first, second)で指定します。
#include <list>
#include <utility>
#include <boost/foreach.hpp>
class Widget {
public:
void test(int n) {}
};
int main()
{
std::list<Widget*> lspw;
BOOST_FOREACH(Widget* pw, std::make_pair(lspw.begin(), lspw.end())) {
pw->test(0);
}
return 0;
}
Notes1. Boost.Foreach
コメント
コメントの投稿
トラックバック
http://articles.blog79.fc2.com/tb.php/32-23cbddb7
この記事にトラックバックする(FC2ブログユーザー)
