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

用BOOST_FOREACH简化遍历操作的更多相关文章

  1. 在ASP.NET Core中使用AOP来简化缓存操作

    前言 关于缓存的使用,相信大家都是熟悉的不能再熟悉了,简单来说就是下面一句话. 优先从缓存中取数据,缓存中取不到再去数据库中取,取到了在扔进缓存中去. 然后我们就会看到项目中有类似这样的代码了. pu ...

  2. Java实现二叉树的创建和遍历操作(有更新)

    博主强烈建议跳过分割线前面的部分,直接看下文更新的那些即可. 最近在学习二叉树的相关知识,一开始真的是毫无头绪.本来学的是C++二叉树,但苦于编译器老是出故障,于是就转用Java来实现二叉树的操作.但 ...

  3. jquery 学习(三) - 遍历操作

    HTML代码 <p>1111</p> <p>1111</p> <p>1111</p> <p>1111</p&g ...

  4. 通过数组和枚举简化GPIO操作编码(转)

    源: 通过数组和枚举简化GPIO操作编码

  5. C# 在多线程环境中,进行安全遍历操作

    本文以List作为操作对象MSDN官方给出的List的线程安全的说法:此类型的公共静态成员是线程安全的.但不能保证任何实例成员是线程安全的.只要不修改该集合,List 就可以同时支持多个阅读器.通过集 ...

  6. 如何利用反射简化Servlet操作

    如何利用反射简化Servlet操作   一.反射的实现 新建类BaseServlet,继承HttpServlet(不需要在web.xml文件中配置) 1.在doPost()方法中处理请求乱码,并调用d ...

  7. 封装CoreGraphics的API简化绘图操作

    封装CoreGraphics的API简化绘图操作 效果 说明 1. 将CoreGraphics的API接口抽象为对象,让绘图变得简单易懂 2. 简化常用的绘制操作 3. 源码长期更新 源码 https ...

  8. Python 中当前位置以及目录文件遍历操作

    Python 中当前位置以及目录文件遍历操作 当前位置 print(os.path.dirname(__file__)) 其中 dirname 会选择目录(文件夹),"__file__&qu ...

  9. 页面存在多个url,使用jmeter进行遍历操作

    有一次遇见一个问题:进入网站后,有多个相同的url,但是仅url后面的路径中id有区别,如下图:这时我想要遍历点击查看url详情内容:那么就可以使用一个“逻辑控制器---foreach控制器” 如下: ...

随机推荐

  1. firefox浏览器中 bootstrap 静态弹出框中select下拉框不能弹出(解决方案)

    问题出现场景1: 在firefox浏览器中在bootstrap弹出的modal静态框中再次弹出一个静态框时 select下拉框不能弹出选项 解决方案:去掉最外层静态框的 tabindex=" ...

  2. 前端--3、jQuery

    介绍 jQuery是一个Javascript框架.其宗旨是——WRITE LESS,DO MORE! 是轻量级的js库,兼容CSS3和各种浏览器. 作用:处理HTMLdocuments.events. ...

  3. 2014中秋节,用java为QQ游戏美女找茬写辅助

    引子        今年中秋闲在家,总要找点事做.        前几天开始学python,很早之前就有计划拿下这门语言了,可惜一直拖到现在……不可否认,我也是个拖沓症患者.在学习python的过程中 ...

  4. NX自动出图 (更新啦)

    1.创建模板类零件图纸 2.创建顶针类零件图纸 3.创建镶件类零件图纸 4.自动创建孔表

  5. Mybatis学习总结二

    Mapper动态代理开发方式 实现原理: Mapper接口开发方法只需要程序员编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象. Mapper接口开发需 ...

  6. 第四节:EasyUI的一些操作

    一丶Datagrid //1.初始化页面数据 LoadGrid: function () { dgLog = $('#dg').datagrid({ url: '/Test_Areas/Test/St ...

  7. ios xmpp 发送语音图片解决方案

    ios xmpp 发送语音,图片解决方案,有需要的朋友可以参考下. 目前做IM多是用的xmpp. 因为项目需求需要实现语音和图片的发送. 发送语音图片有三种方法. 1,xmpp smack.文件传输方 ...

  8. acm相关(纯转载)

    我觉得很好的文章,之所以放随笔是为了让大家看到这些优秀的博文 acm如何起步 acm重点题型 动态规划题目总结 背包九讲阅读网站

  9. C++ string 是否以‘\0’结尾 讨论

    转载https://blog.csdn.net/qq_31930499/article/details/80374310 之前在某篇文章中看到,C语言字符串是以’\0’结尾的,但是C++string类 ...

  10. MySQL练习题及答案(复习)

    新建一个叫做 review 的数据库,将测试数据脚本导进去.(可以使用Navicat查询功能) /* Navicat MySQL Data Transfer Source Server : DB So ...