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里面,会导致模板类失效。