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实现。太牛了。

最新文章

  1. angular2学习--根模块
  2. 使用c#对windows进行关机、重启或注销
  3. 谢欣伦 - OpenDev原创教程 - 通信开发库libComm
  4. liunx之:解决liunx下dns配置重启失效的问题
  5. MMORPG大型游戏设计与开发(客户端架构 part5 of vegine)
  6. Hadoop.2.x_网站PV示例
  7. 测试的程序 test.php,保存放IIS的根目录下
  8. 关于Thread.IsBackground属性的理解(转载)
  9. 转 如何使用velocity模板引擎开发网站
  10. SQL Server 数据类型陷阱
  11. 【转贴】 Flex 预编译处理 与 手机项目、Web项目、Air项目自由转换
  12. iOS 环信消息撤回
  13. 在Debian 8 上安装自动化工具Ansible
  14. cookie sessionStorage localStorage 之间的关系
  15. Angular5 路由传参的3种方法
  16. C# 接口的使用(工厂模式)
  17. 查看linux的公网地址
  18. angular4中引入quill editor
  19. DDD领域模型之分配权限(十三)
  20. Lab 1-1

热门文章

  1. 1807. [NOIP2014]寻找道路P2296 寻找道路
  2. re.S解析
  3. Android基础TOP6_1:FrameLyayout和ImageView制作层叠图片
  4. solr深分页,游标操作分页,解决性能问题
  5. 自学php【二】 PHP计算时间加一天
  6. bootstrap datatable 数据刷新问题
  7. Beta冲刺提交-星期四
  8. 文件和打印共享资源(IP地址)处于联机状态,但未对连接尝试做出响应。
  9. go new() 和 make() 的区别
  10. 浅谈es6 promise