用BOOST_FOREACH簡化遍歷操作

BOOST_FOREACH可以方便的遍歷STL容器.

只需要頭文件:

#include <boost/foreach.hpp>

然後遍歷容器vector/list/set/deque/stack/queue都是類似的:

vector<int32_t> _v;
BOOST_FOREACH(int32_t value,_v)
{
//這裏就可以訪問value
}

同時元素還支持引用,const,比如上面代碼還可以寫成:

vector<int32_t> _v;

BOOST_FOREACH(int32_t
& value,_v)
{
//這裏就可以修改/訪問value
}

如果元素內容是結構體之類,引用可以防止拷貝~~

對於map的訪問有一點特殊,因爲map的元素是std::pair<T1,T2>,所以需要寫成這樣:

複製代碼
std::map<int32_t,int32_t> _map;
typedef const std::map<int32_t, int32_t>::value_type const_pair;
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實現,太牛了。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章