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. FCC 基础JavaScript 练习6

    1.对象和数组很相似,数组是通过索引来访问和修改数据,对象是通过属性来访问和修改数据的, 对象适合用来存储结构化数据,就和真实世界的对象一模一样,比如一只猫. 任务 创建一个叫做myDog的对象,它里 ...

  2. Appium环境部署

    Appium 是一个开源.跨平台的自动化测试工具,用于测试原生和轻量移动应用,支持 iOS, Android平台. 需要部署的软件:python环境.nodejs..net framework4.5. ...

  3. dede手机访问网站跳转到手机端模板

    如何手机访问的时候跳转到自己的手机端模板,这时候需要一个js跳转代码:当手机访问的时候直接跳转到手机端 那手机端前提要有手机端的模板 <script> if(navigator.platf ...

  4. Windows下压缩成tar.gz格式

    tar.gz 是linux和unix下面比较常用的格式,几个命令就可以把文件压缩打包成tar.gz格式,然而这种格式在windows并不多见,WinRAR.WinZip等主流压缩工具可以释放解开,却不 ...

  5. CSS:div/img水平垂直居中

    div水平垂直居中方法一: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...

  6. C++调用Com

    需求:1.创建myCom.dll,该COM只有一个组件,两个接口:   IGetRes--方法Hello(),   IGetResEx--方法HelloEx() 2.在工程中导入组件或类型库  #im ...

  7. UVALIVE6886 Golf Bot (FFT)

    题意:打高尔夫 给你n个距离表示你一次可以把球打远的距离 然后对于m个询问 问能否在两杆内把球打进洞 题解:平方一下就好 注意一下x0的系数为1表示打一杆 才发现数组应该开MAXN * 4 之前写的题 ...

  8. thymeleaf在开发环境正常,但用jar运行时报错 Error resolving template template might not exist or might not be accessible

    解决方案: (1)配置中添加  spring.thymeleaf.prefix=classpath:/templates (2)指向模板的路径 不加 /

  9. [bzoj2242][SDOI2011][计算器] (Baby-Step-Giant-Step+快速幂+exgcd)

    Description 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ Z ( mod P )的最小非负整数: 3.给 ...

  10. IDEA下tomcat中web项目乱码,控制台乱码解决指南

    若是由于过滤器,request ,response等原因,不适用. 原文作者:http://www.kafeitu.me/tools/2013/03/26/intellij-deal-chinese- ...