113.STL中的pair
113.STL中的pair
1.pair的简介
pair是C++STL(标准模板库)中的一个现有容器,它将2个数据整合成一组数据,当我们类似需求的时候就可以使用到pair啦!pair其实有点像Python中字典中的键值对(Key-Value),一个Key对应着一个Value。pair的本质其实就是个结构体,它含有两个成员变量first和second。因为使用的是struct不是class,所以在定义后是可以直接使用pair中的成员变量的。
其标准库类型–pair类型定义在#include< utility > 头文件中
#include<utility>
类模板
:
template<class T1,class T2> struct pair;
参数:
T1为第一个元素的数据类型,T2为第二个元素的数据类型。
功能:
pair将一对值(T1和T2)整合为一组数据,这一对值的数据类型可以相同也可以不相同(由我们自己指定),访问pair中的两个数据的值可以通过变量名.first
和变量名.second
来实现。
例:
#include<utility>
#include<iostream>
using namespace std;
int main()
{
pair<string, string>s1;
s1.first = "ctx";
s1.second = "666";
cout << s1.first << endl;
cout << s1.second << endl;
cout << s1.first << s1.second << endl;
return 0;
}
输出:
ctx
666
ctx666
2.pair的定义及初始化
在定义一个类型为pair的对象时最主要的点就是在定义时需要提供两个数据类型,且两个数据类型不必相同。
值得一提的是,pair中的数据类型也可以是C++STL中的自带的容器。
表11.2: pair上的操作 | |
pair<T1, T2> p; | p是一个pair,两个类型分别为T1和T2的成员都进行了值初始化(参见3.3.1节,第88页) |
pair<T1, T2> p(v1, v2) | p是一个成员类型为T1和T2的pair:first和second成员分别用v1和v2进行初始化 |
pair<T1, T2> p = (v1, v2) | 等价于p(v1, v2) |
make_pair(v1, v2) | 返回一个用v1和v2初始化的pair。pair的类型从v1和v2的类型推断出来 |
p.first | 返回p的名为first的(公有)数据成员 |
p.second | 返回p的名为second的(公有)数据成员 |
p1 relop p2 | 关系运算符(<,<=,>,>=)按字典序定义:例如,当p1.first < p2.first 或!(p2. first < p1.first) &&p1.second < p2.second成立时,p1 < p2为true。关系运算利用元素的<运算符来实现 |
p1 == p2 | 当first和second成员分别相等时,两个pair相等。相等性判断利用元素的==运算符实现 |
p1 != p2 |
//定义
pair<int,int>p1; //定义一个pair类型的空对象p1,两个元素的数据类型都是int
pair<int,double>p2; //定义一个pair类型的空对象p2,一个元素的数据类型都是int,另一个是double
pair<double,string>p3; //定义一个pair类型的空对象p3,一个元素的数据类型都是double,另一个是string
pair<string,vector<int> >p4; //定义一个pair类型的空对象p4,一个个元素的数据类型都是string,另一个是vector容器
//初始化
pair<string,string> p1("ctx","666"); //定义一个pair类型的对象p1并初始化,两个元素的类型都是string,初识默认值为ctx和666
pair<string,int> p2("ctx",18); //定义一个pair类型的对象p3并初始化,两个元素的类型分别是string和int,初识默认值为ctx和18
pair<string,int> p3(p2); //拷贝p2的值来初始化p3
pair<string,int> p3=p2; //将p2的值赋值给p3
3.typedef简化pair
pair容器的存在在一定程度上方便了我们,但是如果我们需要同时定义多个相同pair类型的对象的时候正常定义的话是不是就显得有些繁琐了呢,所以我们可以使用到typedef关键字
来简化定义。
//typedef简化pair的定义
typedef pair<string,string> replace;
replace c1("ctx","666");
replace c2("hhxx","ttxs");
cout<<c1.first<<c1.second<<endl;
cout<<c2.first<<c2.second<<endl;
4.pair 中元素的访问
#include<utility>
#include<iostream>
using namespace std;
int main()
{
pair<string, string>s1;
s1.first = "ctx";
s1.second = "666";
cout << s1.first << endl;
cout << s1.second << endl;
cout << s1.first << s1.second << endl;
return 0;
}
输出:
ctx
666
ctx666
5.pair中的make_pair
一般make_pair都使用在需要pair做参数的位置,可以直接调用make_pair生成pair对象
。另一个使用的方面就是pair可以接受隐式
的类型转换,这样可以获得更高的灵活度。
pair<int,double> p1;
p1 = make_pair(18,1.78);
cout<<p1.first<<" "<<p1.second<<endl;
//输出为18 1.78
pair<int,double> p2;
int m = 18;
double n = 1.78;
p2 = make_pair(m,n);
cout<<p2.first<<" "<<p2.second<<endl;
//输出为18 1.78
std::pair<int, float>(18, 1.78);
std::make_pair(18, 1.78);
第一个的second变量是float类型
而make_pair函数会将second变量都转换成double类型。
参考:C++中pair用法
6.通过tie获取pair元素值
在某些清况函数会以pair对象作为返回值时,可以直接通过std::tie进行接收。比如:
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<string>
#include<utility>
#include<tuple>
using namespace std;
pair<string, int> getPreson()
{
return make_pair("Sven", 25);
}
int main()
{
string name;
int ages;
tie(name, ages) = getPreson();
std::cout << "name: " << name << ", ages: " << ages << std::endl;
system("pause");
return EXIT_SUCCESS;
}
输出:
name: Sven, ages: 25
7.创建 pair 对象的函数
想象有一个函数需要返回一个pair。在新标准下,我们可以对返回值进行列表初始
pair<string, int> process(vector<string> &v)
{
//处理v
if(!v.empty())
return {v.back(), v.back().size()};//列表初始化
else
return pair<string, int>();//隐式构造返回值
}
若v不为空,我们返回一个由v中最后一个string及其大小组成的pair。否则,隐式构造一个空pair,并返回它。
我们还可以用make_pair来生成pair对象,pair的两个类型来自于make_pair的参数:
if (!v.empty())
return make_pair(v.back(), v.back(). size());
8.pair 比较操作数
两个 pair 类型数据可以直接使用 ==,!=,<,<=,>,>= 比较大小,比较规则是先以 first 的大小作为标准,只有当 first 相等时才去判别 second 的大小。
例子:
#include <cstdio>
#include <utility>
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;
}
输出:
p1 < p3
p1 <= p3
p1 < p2
9.pair的常见用途
关于 pair 有两个比较常见的例子:
(1)用来代替二元结构体及其构造函数,可以节省编码时间(2) 作为 map 的键值对来进行插入
例子;
#include <iostream>
#include <string>
#include <map>
using namespace std;
int main()
{
map<string, int> mp;
mp.insert(make_pair("hah", 5));
mp.insert(pair<string, int>("heihei", 10));
for (map<string, int>::iterator it = mp.begin(); it != mp.end(); it++)
{
cout << it->first << " " << it->second << endl;
}
return 0;
}
输出:
hah 5
heihei 10