一、pair用法
pair是将2个数据组合成一组数据的一种数据类型,pair是通过struct结构体实现的
其标准库类型--pair类型定义在#include <utility>头文件中
类模板:template<class T1,class T2> struct pair
参数:T1是第一个值的数据类型,T2是第二个值的数据类型。
功能:将一对值合在一起,比如二维坐标(x,y),当然可以用结构体实现,但是使用pair有它的简洁之处。两个值分别通过 .first 和 .second 来访问。
一些用法:
pair<T1, T2> p1; //创建一个空的pair对象(使用默认构造),它的两个元素分别是T1和T2类型,采用值初始化。
pair<T1, T2> p1(v1, v2); //创建一个pair对象,它的两个元素分别是T1和T2类型,其中first成员初始化为v1,second成员初始化为v2。
make_pair(v1, v2); // 以v1和v2的值创建一个新的pair对象,其元素类型分别是v1和v2的类型。
p1 < p2; // 两个pair对象间的小于运算,其定义遵循字典次序:如 p1.first < p2.first 或者 !(p2.first < p1.first) && (p1.second < p2.second) 则返回true。
p1 == p2; // 如果两个对象的first和second依次相等,则这两个对象相等;该运算使用元素的==操作符。
p1.first; // 返回对象p1中名为first的公有数据成员
p1.second; // 返回对象p1中名为second的公有数据成员
p1 = p2; // pair变量间赋值需要注意的是T1和T2的数据类型不一定要相同,本质就是结构体,成员可以是随意的数据类型,甚至可以结构体套结构体,对应的就是pair套pair的嵌套结构
多层嵌套的结构,建议这样写:
比如这道题我的pair嵌套的结构为
typedef pair<int,int> pos;//坐标x和坐标y
typedef pair<pos,int> mmap_node;//.first是坐标(x,y),.second是这个点对应的时间这样的写法比较规范,特别是在多层嵌套的时候不容易混淆
二、例子
例题:找朋友(BFS地图搜索)找朋友 | SDUT OnlineJudge
题目大意:
给定地图长宽,给定地图,* 代表能走,#代表障碍,X是起点,Y是终点,输出最少花费的时间。

想法:
没什么好说的BFS裸题,上下左右移动通过step[4][2]模拟实现
注意:如果在队列中压入结点有这么三种写法
q.emplace(make_pair(0, 0), 0); q.emplace(make_pair(make_pair(0, 0), 0));//最规范 q.push({{0, 0}, 0});//最简洁,但是push还是不推荐用的不推荐用push的原因:
可以看到,push的参数是一个值(value),而emplace的参数是一个参数列表(args),个人感觉如果是对于pair等数据类型的话,还是emplace好一些
完整代码:
#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
#include<utility>
using namespace std;
//typedef struct node
//{
// int x;
// int y;
// int time;
//}Node;
//试试pair
typedef pair<int,int> pos;
typedef pair<pos,int> mmap_node;
int step[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};
void bfs(int startX,int startY,char mmap[][20],int vis[][20],int row,int col)
{
vis[startX][startY] = 1;
queue<mmap_node>q;
q.emplace(make_pair(make_pair(startX,startY),0));
while(!q.empty())
{
mmap_node topNode = q.front();
q.pop();
if(mmap[topNode.first.first][topNode.first.second]=='Y'){
cout<<topNode.second<<endl;
return ;
}
for(int i=0;i<4;i++)
{
int nextX = topNode.first.first + step[i][0];
int nextY = topNode.first.second + step[i][1];
if(nextX<0||nextX>=row||nextY<0||nextY>=col||mmap[nextX][nextY]=='#'||vis[nextX][nextY])
{
continue;
}
vis[nextX][nextY] = 1;
q.emplace(make_pair(make_pair(nextX,nextY),topNode.second+1));
}
}
cout<<-1<<endl;
}
int main()
{
int row,col;
int startX,startY;
char mmap[20][20];
int vis[20][20];
int time[20][20];
while(cin>>row>>col)
{
memset(vis,0,sizeof(vis));
memset(time,0,sizeof(time));
for(int i=0;i<row;i++)
{
cin>>mmap[i];
}
for(int i=0;i<row;i++)
{
int j;
for(j=0;j<col;j++)
{
if(mmap[i][j]=='X')
{
startX = i;
startY = j;
break;
}
}
if(j<col) break;//剪枝优化
}
bfs(startX,startY,mmap,vis,row,col);
}
return 0;
}
版权声明:本文为weixin_43721423原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。

