C++ 之 pair用法及例子

一、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版权协议,转载请附上原文出处链接和本声明。