pair是一个很实用的“小玩意”,当想要将两个元素绑在一起作为一个合成元素、又不想要因此定义结构体时,使用pir可以很方便地作为一个代替品。

要使用pair,应先添加头文件#include <utility>,并在头文件下面加上“ using namespace std;"。

注意:

由于map的内部实现中涉及pair,因此添加map头文件时会自动添加utiliy头文件,此时如果需要使用pai,就不需要额外再去添加utility头文件了。因此,记不住“utility”拼写的读者可以偷懒地用map头文件来代替utility头文件。

实际上可以将pair看作一个内部有两个元素的结构体,且这两个元素的类型是可以指定的,如下面的短代码所示:

struct pair {
typename1 first;
typename2 second;
};

1.pair的定义

pair有两个参数,分别对应first和second的数据类型,它们可以是任意基本数据类型或容器。

pair<typename1, typename2> name;

想要定义参数为string和int类型的pair,就可以使用如下写法:

pair<string, int> p;

如果想在定义pair时进行初始化,只需要跟上一个小括号,里面填写两个想要初始化的元素即可:

pair<string, int> p("haha", 5);

而如果想要在代码中临时构建一个pair,有如下两种方法:

①将类型定义写在前面,后面用小括号内两个元素的方式。

pair<string, int>( haha,5);

②使用自带的 make pair函数。

make_pair("haha",5);

使用实例请参考“pair中元素的访问”。

2.pair中元素的访问

pair中只有两个元素,分别是first和second,只需要按正常的结构体的方式去访问即可。

程序代码:

#include<iostream> 
#include<utility>
#include<string>
using namespace std;
int main(){
pair<string, int> p;
p.first = "lichuachua";
p.second = 6;
cout<<p.first<<" "<<p.second<<endl;
p = make_pair("ai",7);
cout<<p.first<<" "<<p.second<<endl;
p = make_pair("xuexi",8);
cout<<p.first<<" "<<p.second<<endl;
return 0;
}

运行结果:

pair的常见用法详解_c++

3.pair常用函数实例解析

比较操作数

两个pair类型数据可以直接使用=、!=、<、<=、>、>=比较大小,比较规则是先以first的大小作为标准,只有当first相等时才去判别 second的大小。

程序代码:

#include<iostream> 
#include<utility>
#include<string>
using namespace std;
int main(){
pair<int, int> p1(5,10);
pair<int, int> p2(5,15);
pair<int, int> p3(10,5);
if(p1<p3) printf("p1<p3\n");
if(p1<=p3) printf("p1<=p3\n");
if(p1<p2) printf("p1<p2\n");
return 0;
}

运行结果:

pair的常见用法详解_职场和发展_02

4.pair的常见用途

关于pair有两个比较常见的例子:

①用来代替二元结构体及其构造函数,可以节省编码时间。

②作为map的键值对来进行插入,例如下面的例子。

程序代码:

#include<iostream> 
#include<map>
#include<string>
using namespace std;
int main(){
map<string, int> mp;
mp["lichuachua"] = 6;
mp.insert(make_pair("ai",7));
mp.insert(pair<string, int>("xuexi",8));
for(map<string, int>::iterator it = mp.begin();it != mp.end();it++) {
cout<<it->first<<" "<<it->second<< endl;
}
return 0;
}

运行结果:

pair的常见用法详解_#include_03

最终结果为

ai 7
lichuachua 6
xuexi 8

的原因是map会以键从小到大的顺序自动排序,即按照a<b<c<d<e的顺序排序这三对映射。(map和set内部时使用红黑树实现的)

想要了解map的请参考:​​map的常用用法详解​