本文主要是介绍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 testvector<int> vec=(list_of(1),2,3,5);foreach(int& x,vec){cout<<x<<" ";}cout<<endl;//map testmap<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里面,会导致模板类失效。
这篇关于Boost程序库学习-foreach的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!