今天在学到广度优先搜索时,学长给我们提到大部分广度优先搜索都会用到队列(queue),而在使用queue时有两种方法来给队列赋多个值,一个是自写结构体,另一个就是使用pair。
pair是将2个数据组合成一个数据,当需要这样的需求时就可以使用pair。就像STL中的map就是将key和value放在一起来保存。同样的,当一个函数需要返回2个数据的时候,可以选择pair。pair会将两个数据分别转换为first和second储存到pair定义的变量中。
拿广度优先搜索来举例,可以使用queue<pair<int,int> > q来定义一个队列,我们可以拿这个q.front().first来储存坐标x,用q.front().second来储存坐标y,然后进行递推。
queue<pair<int,int> > q;
//first指示x,second指示y
或者我们在利用队列表示两个数值的时候也可以用pair
queue<pair<int,int> > q;
//first指示层数,second指示次数
而在pair定义下可以以两种方式来向队列中存入数据
如借助make_pair()函数或者用{}来存入
q.push(make_pair(x,y));
q.push({x,y});//在c11中使用,建议使用第一种方法
另外当队列有多个数据时可以使用pair<pair<int,int>,pair<int,int>>,这样就可以存入四个或四个以上的数据了,建议当数据超过四个以后使用结构体。
queue<pair<pair<int,int>,int> >q;
//first指示坐标,second指示长度
typedef pair<int,int> PII;
//这里是简写
queue<pair<PII,PII> > q;
//first指示坐标,second指示转弯数和方向
而在访问队列中数据时就通过first与second来得到想要的数据
如
queue<pair<int,int> > q;
//first指示层数,second指示次数
//这个就很清楚了
int t=q.front().first;
int tt=q.front().second;
//存入数据时
q.push(make_pair(t,tt));
queue<pair<pair<int,int>,int> >q;
//first指示坐标,second指示长度
//这个first是以pair定义的一个结构所以可以存两个数
int x=q.front().first.first;
int y=q.front().first.second;
//储存坐标
int l=q.front().second;
//储存长度
//存入数据时
q.push(make_pair(make_pair(x,y),l));
typedef pair<int,int> PII;
queue<pair<PII,PII> > q;
//first指示坐标,second指示转弯数和方向
//这个就可以存四个数了
int x=q.front().first.first;
int y=q.front().first.second;
//储存坐标
int t=q.front().second.first;//拐弯数
int f=q.front().second.second;//方向
//存入数据时
q.push(make_pair(make_pair(x,y),make_pair(t,f)));