BOOST_FOREACH能夠方便的遍歷STL容器.
僅僅須要頭文件:
#include <boost/foreach.hpp>
然后遍歷容器vector/list/set/deque/stack/queue都是類似的:
BOOST_FOREACH(int32_t value,_v)
{
// 這里就能夠訪問value
}
同一時候元素還支持引用,const,比方上面代碼還能夠寫成:
BOOST_FOREACH(int32_t & value,_v)
{
// 這里就能夠改動/訪問value
}
假設元素內容是結構體之類,引用能夠防止拷貝~~
對於map的訪問有一點特殊,由於map的元素是std::pair<T1,T2>,所以須要寫成這樣:
BOOST_FOREACH(const_pair & node,_map)
{
// 這里就能夠訪問node的元素
int32_t key = node.first;
int32_t value = node.second;
}
multimap么臨時還沒用過,只是相信也是類似的...感覺multimap有一點類似於map<key,set<value> > :-D
BOOST_FOREACH是正向的迭代,逆向的是BOOST_REVERSE_FOREACH。
看看BOOST_FOREACH的實現吧:
///////////////////////////////////////////////////////////////////////////////
// BOOST_FOREACH
//
// For iterating over collections. Collections can be
// arrays, null-terminated strings, or STL containers.
// The loop variable can be a value or reference. For
// example:
//
// std::list<int> int_list(/*stuff*/);
// BOOST_FOREACH(int &i, int_list)
// {
// /*
// * loop body goes here.
// * i is a reference to the int in int_list.
// */
// }
//
// Alternately, you can declare the loop variable first,
// so you can access it after the loop finishes. Obviously,
// if you do it this way, then the loop variable cannot be
// a reference.
//
// int i;
// BOOST_FOREACH(i, int_list)
// { ... }
//
#define BOOST_FOREACH(VAR, COL) /
BOOST_FOREACH_PREAMBLE() /
if (boost::foreach_detail_::auto_any_t _foreach_col = BOOST_FOREACH_CONTAIN(COL)) {} else /
if (boost::foreach_detail_::auto_any_t _foreach_cur = BOOST_FOREACH_BEGIN(COL)) {} else /
if (boost::foreach_detail_::auto_any_t _foreach_end = BOOST_FOREACH_END(COL)) {} else /
for (bool _foreach_continue = true; /
_foreach_continue && !BOOST_FOREACH_DONE(COL); /
_foreach_continue ?
BOOST_FOREACH_NEXT(COL) : (void)0) /
if (boost::foreach_detail_::set_false(_foreach_continue)) {} else /
for (VAR = BOOST_FOREACH_DEREF(COL); !_foreach_continue; _foreach_continue = true)
#endif
//代碼一共同擁有800多行。我列出了最后的凝視和定義。
我認為BOOST_FOREACH有點搞過頭了。手寫for的循環。最多也就兩行。為什么要為形式上的簡單而引入如此多的定義和編譯器解析。並且這還是個宏。我不是反對宏,僅僅是認為宏在這個地方沒帶來太多優點,反而添亂。調試的噩夢,郁悶死。
不是每一個庫都是那么精彩和有用的。std::vector<bool>的特化。std::auto_ptr的設計也都不那么讓人舒適。
保持腦袋清醒,有選擇的使用類庫吧。
最后。還是要感嘆一下BOOST_FOREACH實現。太牛了。

