Boost程序库学习-foreach

foreach

C#,java等对容器中的元素遍历都进行了较好的支持,一个foreach,C++的新标准也采用了for(auto &),但是对于旧的标准我们依旧无法进行简便 的处理。
boost的foreach应运而生。

1.使用

foreach提供宏:BOOST_FOREACH,实现正向遍历。

void foreachTest()
{
    using namespace boost::assign;
    map<int,string>v=map_list_of(1, "one")(2, "two")(7, "three");
    typedef map<int,string>::value_type define_pair;
    BOOST_FOREACH(define_pair& node,v)
    {
        cout<<node.first<<",";
    }
    cout<<endl;
    BOOST_AUTO(it,v.begin());
    for(;it!=v.end();it++)
    {
        cout<<it->first<<" ";
    }
    cout<<endl;
    string str("boost foreach");
    BOOST_FOREACH(char &c,str)
    {
        cout<<c<<" -";
    }
    cout<<endl;
}
void foreachSetTest()
{
    using namespace boost::assign;
    set<int> set=(list_of(10),20,30);
    // BOOST_AUTO(y)
    BOOST_FOREACH(int x,set)
    {
        cout<<x<<" ";
    }
    cout<<endl;
    BOOST_AUTO(y,*set.begin());
    BOOST_FOREACH(y,set)
    {
        cout<<y<<" ";
    }
    cout<<endl;
}

BOOST_AUTO着实是一个好玩的函数,能够自动的获知变量的类型。这一函数完全取代了以前的

set<int>::iterator y=set.begin()

FOREACH简化了

for(y;y!=set.end();y++)
{}

2.进一步优化方法

有时候写BOOST_FOREACH如果觉得太长,可以进行宏定义

#define foreach BOOST_FOREACH

代码为:

void graceFroeachTest()
{
    //使用宏定义
    using namespace boost::assign;
    //vector test
    vector<int> vec=(list_of(1),2,3,5);
    foreach(int& x,vec)
    {
        cout<<x<<" ";
    }
    cout<<endl;
    //map test
    map<int,string>m=map_list_of(1,"111")(2,"222")(3,"333");
    // typedef map<int,string>::value_type vt;
    // foreach(vt&vt,m)
    // {
    //     cout<<vt.first<<"-"<<vt.second<<endl;
    // }
    pair<int,string>vt;
    foreach( vt,m)
    {
        cout<<vt.first<<"-"<<vt.second<<endl;
    }
}

3.自定义结构体

如果是自定义的类,使用方式类似:

class A
{
  public:
  A(int data ):_data(data){}
  ~A()
  {
      cout<<"deconstruct A:"<<_data<<endl;
  }
  public:
  int _data;  
};
int foreachClassTest()
{
    A *a1=new A(1);
    A *a2=new A(2);
    std::vector<A*>_vecA;
    _vecA.push_back(a1);
    _vecA.push_back(a2);
    foreach(A *a,_vecA)
    {
        cout<<"data is:"<<a->_data<<endl;
        delete a;
        a=NULL;
    }
    return 0;
}
程序运行结果为:
data is:1
deconstruct A:1
data is:2
deconstruct A:2

4.注意事项

  • BOOST_FOREACH循环中不能改变序列的长度,即不能增加减少容器中的元素,这一点很容易理解,因为会破坏遍历iterator,导致失效。
  • 只接受两个参数,因此对于map等容器,可以采用的方式如下:
typedef map<int,string>::value_type vt;
pair<int,string>vt;
  • 最好不要把(pair<int,string>x)放在boost_foreach里面,会导致模板类失效。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值