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,只需要按正常的结构体的方式去访问即可。
程序代码:
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;
}
运行结果:
3.pair常用函数实例解析
比较操作数
两个pair类型数据可以直接使用=、!=、<、<=、>、>=比较大小,比较规则是先以first的大小作为标准,只有当first相等时才去判别 second的大小。
程序代码:
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;
}
运行结果:
4.pair的常见用途
关于pair有两个比较常见的例子:
①用来代替二元结构体及其构造函数,可以节省编码时间。
②作为map的键值对来进行插入,例如下面的例子。
程序代码:
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;
}
运行结果:
最终结果为
ai 7
lichuachua 6
xuexi 8
的原因是map会以键从小到大的顺序自动排序,即按照a<b<c<d<e的顺序排序这三对映射。(map和set内部时使用红黑树实现的)
想要了解map的请参考:map的常用用法详解