首页 > 其他分享 >113.STL中的pair

113.STL中的pair

时间:2023-07-23 12:44:37浏览次数:36  
标签:p2 p1 STL second 113 pair include first

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使用详细说明

标签:p2,p1,STL,second,113,pair,include,first
From: https://www.cnblogs.com/codemagiciant/p/17574880.html

相关文章

  • C++ stl锁的使用
    我们在日常开发中经常要用到锁,这里记录一下实际开发过程中stl提供的锁的使用。1、读写锁读写锁算是用到的比较多的一种类型,主要实现对于同一个共享数据区,一个时间点只能有一个线程进行写(增删改),但可以有多个线程同时读(查)。换句话说,当有一个线程写的时候,其他线程(不管是读线程还是......
  • 112.STL中的array
    112.STL中的array1.array介绍在C++标准库中,array是固定大小的序列容器,array中包含特定个数并且严格按照线性序列排序的元素。因此array允许对元素进行随机访问,指向某一元素的指针可以通过偏移访问其他元素。在array内部,它只保存自己包含的元素,其他任何信息都不保存,包括自身的大......
  • CF1132G Greedy Subsequences
    简单题。\(i\)向\(i\)后第一个\(j\),\(a_j\)比\(a_i\)大的点连边,不难发现最后形成了一棵森林,并且一个点的父亲\(\text{fa}_i>i\)。题目变成了取\([l,r]\)中的点为起点,向祖先方向走去并且终点编号\(\ler\)的最长链长度。考虑离线,维护从每个点开始的最长链长度\(f_i......
  • 暑假对STL的学习用法
    mapmap<int,int>s;map<int,vector<int>>s;map<int,list<int>>s;这些就是map的初始化法子,前面那个就相当于数组下标,后面的就是键值了,可以用它搞二维数组就像第二三个一样。然后就是他的用处,他可以自动排序,但是是按照前面的key值排序,就是下标拉,不过看你怎么用这个东西,这......
  • Whistle(基于Node实现的跨平台转包调试工具)的使用
    可抓包,可显示vconsolet调试一、安装npmi-gwhistle二、启动手机和电脑处于同一网络w2start--init浏览器打开地址:http://127.0.0.1:8899/三、配置Rules:https://testh.app.coc.10086.cnwhistle.inspect://vConsoleconsole安装插件: w2installwhistle.ins......
  • 元组:pair 与 tuple
    众所周知,代码简短不一定易懂,但pair和tuple也确实是十分方便的多元组,适当使用可以使代码变简短。前置:结构体应该是最简洁明了的多元组吧。当你需要将一些数据捆绑在一起时,你可以使用结构体。structNode{inta,b;stringc;}a;cout<<a.a<<''<<a.b<<'......
  • Proj. CMI Paper Reading: Conversational Automated Program Repair
    Abstract背景:之前APR与大模型的结合仅仅使用了一些特殊构建的input/prompt本文:conversationalAPR方法:使用long-termcontextwindow来记录之前的validationfeedback实验:在10个LLMs上进行对比展示改进......
  • mysql 数据库 1130 error
    mysql-uroot-p接下来输入刚刚创建的密码  成功进入之后需要输入以下命令usemysql;  //切换数据库updateusersethost='%'whereuser='root';  输入完成之后 selectHost,Userfromuser;查看以下修改结果 +-----------+---------------+|Host|User......
  • Oracle学习笔记:parallel并行处理 --转载 https://blog.csdn.net/w892824196/article/
    在使用oracel查询时,可以通过并行提高查询速度。例如:select/*+parallel(a,6)*/count(1)fromtable_namea;强行启用并行度来执行当前SQL。加上这个说明之后,可以强行启用Oracle的多线程处理功能,提高效率。但本身启动这个功能,也是要消耗资源与性能的。所有,一般都会在返回记......
  • C++ STL容器之vector、list
    (1)vector连续存储的容器,动态数组,在堆上分配空间底层实现:数组扩容机制:vector增加(插入)新元素时,如果未超过当时的容量,则还有剩余空间,那么直接添加到最后(插入指定位置),然后调整迭代器。如果没有剩余空间了,则会重新配置原有元素个数的两倍空间,然后将原空间元素通过复制的方式初始......