113.STL中的pair

发布时间 2023-07-23 12:39:22作者: CodeMagicianT

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

参考:C++中pair使用详细说明