使用 boost.foreach foreach

C++boostboost/foreach.hpp遍历头文件最全总结及与std::for_each区别介绍 目录一、 头文件概述 是 Boost 库中的一个头文件,而不是 C++ 标准库的一部分。它提供了一个名为 的宏,用于简化容器和数组的遍历操作。它既不是模板类也不是模板函数,而是一个宏,旨在使遍历容器和数组的代码更加简洁和易读。使用 可以避免使用迭代器的繁琐操作,提高代码的可读性和可维护性。二、 中的函数和方法概述2.1 宏的基本用法: - : - 这是 宏的基本形式,其中 是迭代变量, 是要遍历的容器或数组。 - 使用场景:当需要遍历容器或数组中的元素,并且不想使用迭代器的传统 循环时使用,能使 阅读详情

使用 boost.foreach foreach

作者: 江淼
Blog: http://blog.csdn.net/jiangfriend
时间: 2007-7-28 14:56

用过别的语言的朋友一定深受foreach这个命令所带来方便,可惜C++并没提供,随着1.34.0 boost.foreach正式成为boost的一部分,而且boost.foreach相当的简单易用。从此c++也有了foreach。

一、使用方法

语法:
BOOST_FOREACH( VAR, COL )
{
    // To do
}
非常简单明了

例:
#include <string>
#include <iostream>
using namespace std;
#include <boost/foreach.hpp>
int main(int argc, char* argv[])
    {
    string str("The quick brown fox jumps over the lazy dog.");
    BOOST_FOREACH(char c,str)
        {
        cout<<c<<endl;
        }
    return 0;
    }

若#define foreach BOOST_FOREACH,几乎可以把foreach当成是内部保留关键字。

二、扩展foreach

并不是所有的对象都能支持foreach
如:
struct MyString
    {
    string str;
    };
那么我们需要自已手动扩展foreach。

相应的,需要重写以下几个相关函数与结构
range_iterator<Link>;
boost_range_begin( Link& );
boost_range_end(Link& );
range_const_iterator<Link>; //常数
boost_range_begin(const Link&);
boost_range_end(const Link& );

则修改程序为
#define foreach BOOST_FOREACH
#include <string>
#include <iostream>
using namespace std;
#include <boost/foreach.hpp>

struct MyString
    {
    string str;
    typedef string::iterator iterator;
    typedef string::const_iterator const_iterator;
    MyString(const string& str):str(str)
        {
        }
    inline iterator begin(void)
        {
        return str.begin();
        }
    inline iterator end(void)
        {
        return str.end();
        }
    inline const_iterator begin(void) const
        {
        return str.begin();
        }
    inline const_iterator end(void) const
        {
        return str.end();
        }
    };

/**
 * 以下为主要重写代码
 */
namespace boost
    {
    template<>
    struct range_iterator<MyString>
        {
        typedef MyString::iterator type;
        };
    template<>
    struct range_const_iterator<MyString>
        {
        typedef MyString::const_iterator type;
        };

    inline range_iterator<MyString>::type boost_range_begin( MyString& str)
        {
        return str.begin();
        }
    inline range_iterator<MyString>::type boost_range_end( MyString& str)
        {
        return str.end();
        }

    inline range_const_iterator<MyString>::type boost_range_const_begin( const MyString& str)
        {
        return str.begin();
        }
    inline range_const_iterator<MyString>::type boost_range_const_end( const MyString& str)
        {
        return str.end();
        }
    }
int main(int argc, char* argv[])
    {
    MyString str("The quick brown fox jumps over the lazy dog.");
    foreach(char c,str)
        {
        cout<<c<<endl;
        }
    return 0;
    }

虽然有点烦,但还是相当简单的。

三、注意事项

因语言限制BOOST_FOREACH(std::pair<int,int>& p,m)是不被支持的
因为int与int之间存在逗号,而BOOST_FOREACH是宏,BOOST_FOREACH理解为(std:pair<int,    int>&p,m)

int main(int argc, char* argv[])
    {
    map<int,int> m;
    m[1]=1;
    foreach(const map<int,int>::value_type& p,m) //错误
        {
        cout<<p.first<<endl;
        }
    return 0;
    }

需改写成
int main(int argc, char* argv[])
    {
    typedef map<int,int> map_int;
    map_int m;
    m[1]=1;
    foreach(const map_int::value_type& p,m)
        {
        cout<<p.first<<endl;
        }
    return 0;
    }

四:篇后语

foreach简化了编程过程实在可喜可贺,但boost普及率不高,也只能内部用用,比较可惜的。
另外,boost.foreach对于non-copyable与lightweight也有特别的处理方式,具体情况可以参照官方文档。

五:相关链接

foreach官方文档 http://www.boost.org/doc/html/foreach.html
boost官方站点 http://www.boost.org

BOOST_FOREACH宏解析实例 在上述代码中,我们使用BOOST_FOREACH宏两次,第一次使用引用的方式修改了容器中元素的值,第二次使用非引用的方式遍历并输出了容器中元素的值。说明BOOST_FOREACH宏可以作为一种易读易用的遍历容器的方式,并且还可以灵活地应用在不同类型、不同维度的容器中。C++中的BOOST_FOREACH宏可以方便地对一个容器进行遍历,避免了循环计数器变量的使用,代码看似更加简洁优美。下面提供一个关于BOOST_FOREACH宏的实例,展示它的使用方法和效果。BOOST_FOREACH宏解析实例。 阅读详情

相关推荐

使用右值常量进行测试的boost::foreach模块

其中一个模块是boost::foreach,它提供了一种简化循环遍历容器的语法。本文将介绍如何在boost::foreach模块中使用右值常量进行测试,并提供相应的源代码示例。右值引用允许我们绑定到临时对象或将要销毁的对象,而右值常量则表示一个临时的不可修改的值。boost::foreach模块可以与右值常量一起使用,以遍历包含右值常量的容器。然后,我们使用boost::foreach模块遍历了一个包含了右值常量的std::vector容器。使用右值常量进行测试的boost::foreach模块。

ByteWhizX的博客 213

BOOST_FOREACH用法教程

类似perl和c#的foreachBOOST_FOREACH给我们带来了一种简单而有效的遍历数组的方式。 让我们首先来看个简单的例子: #include #include #include int main() { std::string hello( "Hello, world!" ); BOOST_FOREACH( char ch, hell

固本培元的专栏 6669

使用boost::foreach遍历非常量右值的测试程序

对于C++开发者来说,foreach是一个非常便利的语法糖。但是,在遍历非常量右值(rvalue)时,可能会遇到一些困难。为了解决这个问题,我们可以使用boost::foreach模块提供的BOOST_FOREACH宏。这个宏不仅可以遍历常量引用和指针,还可以遍历非常量右值。总的来说,BOOST_FOREACH是一个非常实用的模块,可以帮助我们更方便地遍历各种类型的容器,并且对于遍历非常量右值时,它也提供了良好的支持。例如,它不能用于原始数组类型,因为原始数组类型不是可以迭代的容器。

Meta_C的博客 125

boostforeach

头文件 #include “boost/foreach.hpp” foreach可以用在array, string还有其他stl的容器如vector,list,deque上,形式为 BOOST_FOREACH( 元素, 可迭代对象),还有BOOST_REVERSE_FOREACH(元素类型, 可迭代对象)可以用于反向迭代。 foreach还可以作用于能够返回可迭代对象的函数上。 元素字段可以返回引用

gx_1983的专栏 1534

BOOST_FOREACH 介绍

“Make simple things easy.” -- Larry Wall c++中,写一个循环去迭代一个序列是很单调的。 1 string hello("hello, boost!");2 3 for (int i = 0; i != hello.size(); ++i) 4 { 5 cout<<hello.at(i); 6 } ...

weixin_34163553的博客 226

Boost程序库学习-foreach

foreachC#,java等对容器中的元素遍历都进行了较好的支持,一个foreach,C++的新标准也采用了for(auto &),但是对于旧的标准我们依旧无法进行简便 的处理。 boostforeach应运而生。1.使用foreach提供宏:BOOST_FOREACH,实现正向遍历。void foreachTest() { using namespace boost:

tang_jin2015的专栏 787

boostBOOST_FOREACH使用说明

简介 boostBOOST_FOREACH可以用来简化STL容器的迭代操作。 使用示例 #include <boost/foreach.hpp> vector<int> boxes= {1,2,3}; BOOST_FOREACH(int box,boxes) //遍历boxes中每个元素,赋值给box { //这里就可以访问box std::cout <&l...

爱问西瓜爱大树的博客 611

BOOST_FOREACH 使用及注意事项

BOOST_FOREACH可以简化便利操作。 例如 #include <boost/foreach.hpp> #include <vector> #include <iostream> int main() { std::vector<int> vInt; for(int i = 0; i < 10; i++) { ...

guoguangwu的专栏 766

BOOST_FOREACH使用

对于STL的遍历操作,可以使用std:for_each,但是使用std:for_each的话,操作起来不是很灵活。 1 // for_each. Apply a function to every element of a range. 2 template <class _InputIter, class _Function> 3 _Function for_each(_...

weixin_30674525的博客 135

BOOST_FOREACH使用简单例子

迭代MAPmapint,int> mi;    for (int x=0;xx++)    {        mi.insert(make_pair(x,x+1));    }    typedef mapint,int> m;    BOOST_FOREACH(m::value_type& i,mi)    {couti.secondendl;    }

云魂工作室-AKAI 1520

C++ boost库教程(九):boost for循环

boost for循环提供了两个宏: 正向迭代 BOOST_FOREACH, 逆向迭代 BOOST_REVERSE_FOREACH 使用时需要包含头文件 #include <boost/foreach.hpp> 基本操作和C++ 11的 for类似,...

琅嬛福地 1839

BOOST_FOREACH

成天写迭代器,写的手指都疼,BOOST_FOREACH可以方便的遍历STL容器. 只需要头文件: #include 然后遍历容器vector/list/set/deque/stack/queue都是类似的: vectorint32_t> _v; BOOST_FOREACH(int32_t value,_v) { //这里就可以访问value } 同时元素还支持引用,co

470

BOOST_FOREACH缺陷

以下来自手册: 缺陷 本节描述 BOOST_FOREACH 中的一些常见的缺陷。 带逗号的类型 由于 BOOST_FOREACH 是一个宏,它必须刚好有两个参数,并以一个逗号分隔它们。这并不总是很方便,尤其当循环变量的类型是一个模板的时候。考虑一下对 std::map 进行迭代: std::mapint,int> m; // 错误!BOOST_FOREACH 宏参

永无止境 1370

boost::foreach模块测试代码

使用boost::foreach模块遍历容器时,我们需要使用BOOST_FOREACH(iter, container)宏,其中iter为遍历时当前元素的临时变量名,container为要遍历的容器名。BoostC++中常用的基础库之一,其中的foreach模块提供了一种简便的遍历容器的方法。通过以上示例代码,我们可以看到使用boost::foreach模块可以简化C++容器的遍历操作,同时也提供了基于范围的循环方式。在使用foreach模块时,需要引入boost/foreach.hpp头文件。

DevScribe的博客 155

BOOST C++ 16 语言扩展】(2) Boost.Foreach

Boost.Foreach 提供了一个宏来模拟 C++11 中基于范围的 for 循环。您可以使用boost/foreach.hpp 中定义的宏 BOOST_FOREACH 来迭代序列而不使用迭代器。如果你的开发环境支持C++11,可以忽略Boost.Foreach

gongdiwudu的专栏 4376
上一篇: 一步一步学写makefile (三) - 隐规则
下一篇: sprintf,lexical_cast,format 三者效率比较
Jiangfriend
博客等级 码龄19年 7粉丝 7原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值