pair用法大全

记得上次讲了pair,今天我就把pair的用法补全。

设想一下你是一个小卖部老板,但是你运气不太好,刚开业就遇上一个刁钻的顾客,他买东西时可能会直接报物品名(老板,我要xxx),也可能会报价格(老板,我要那个xx元的东西),而且他还会经常来这儿买东西。毕竟你刚开业嘛,所以你想尽量挽留住这个常客,可是,该怎么才能游刃有余地跟他做交易呢?最好的办法就是——把价目表背下来。用c++术语表达,就是用两个map分别对应【价格-名字】和【名字-价格】。但是,用map做太花时间了,毕竟“一个操作重复20次”可并非虚名,而且还是梅开二度,双倍时间,数据稍稍大一点就TLE了。所以,有请pair登场!

pair分frist和second,一般有sort需求的是frist,这就证明它可以双向查找(map梅开二度的问题解决了),而且,它不用一个操作重复20次(一个操作重复20次的问题也解决了)。

接下来是其他大佬那转载的干货:

pair是C++STL(标准模板库)中的一个现有容器,它将2个数据整合成一组数据,当我们类似需求的时候就可以使用到pair啦!pair其实有点像Python中字典中的键值对(Key-Value),一个Key对应着一个Value。pair的本质其实就是个结构体,它含有两个成员变量first和second。因为使用的是struct不是class,所以在定义后是可以直接使用pair中的成员变量的。
其标准库类型–pair类型定义在#include< utility > 头文件中

参数:T1为第一个元素的数据类型,T2为第二个元素的数据类型。
功能:pair将一对值(T1和T2)整合为一组数据,这一对值的数据类型可以相同也可以不相同(由我们自己指定),访问pair中的两个数据的值可以通过变量名.first变量名.second来实现。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/H1727548/article/details/130745843

pair的定义

(1):pair是将两个数据组合成一组数据,pair的实现其实是一个结构体,既然是将两个数据组合成一个数据,那么里面自然就有两个数据了,我们将其称之为成员变量,分别为first和second。

2:pair的操作以及使用

(1)定义pair类型://定义一个pair的基本格式
pair<p1,p2>name;
//在这里的p1和p2分别表示数据类型(就是int,char那些),这里的name表示你自己取得名字,就是这个是你定义的
//不过如果定义多个pair的话,我们会觉得太麻烦,会使用typedef来重命名
typedef pair<p1,p2>ua;
ua a;
//这里的ua就是类型的新名字了,a就是变量名字啦,后面会有代码例子具体给大家

2)pair的基本操作
其中的赋值操作直接使用=就可以了,只有它的first和second两个都相等才相等。
比较大小的话是按字典顺序来比较的,先比较first然后比较second,如果first不一样就不需要在比较second了
初始化pair的话可以在定义的时候直接初始化,也可以使用make_pair初始化,具体如何使用大家可以看看下面的代码,嘿嘿嘿!!!
至于pair的输出,之前在前面已经说过了,用到的是成员变量,那我们就要用到点号运算符了,就是"  .   "具体操作大家看下下面的代码,嘿嘿嘿!!!!!
#include<bits/stdc++.h>
using namespace std;
//因为定义pair比较繁琐,所以我一般用typedef重命名
typedef pair<int,string>au;
typedef pair<int,int>bu;
int main()
{
    //初始化pair我一般使用两种
    //第一种:直接初始化
    au p1(1,"niubi");
    //第二种,使用make_pair
    au p2;
    p2=make_pair(23,"iuiu");
    //因为pair是将两个数据组合成一组数据,所有我们可以
    //认为里面有两个数据,我们将它成为成员变量
    //也就是first和second
    cout<<p1.first<<" "<<p1.second<<endl<<p2.first<<" "<<p2.second<<endl;
    au p3=make_pair(1,"sdd");
    au p4=make_pair(1,"niubi");
    if(p3==p1)cout<<"true"<<endl;
    else cout<<"false"<<endl;
    bool h=p3>p4;
    cout<<h;
    return 0;
}
3:总结:
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/gaoqiandr/article/details/125634111

C++——pair用法总结
1.pair概述(在标头 <utility> 定义)
2.pair使用
2.1成员函数(构造函数、赋值函数)
2.2非成员函数
2.3辅助类
使用
1.pair概述(在标头 定义)
std::pair 是类模板,提供在一个单元存储两个相异类型对象的途径。简单描述,即pair可以将2个数据组合为一个数据,当然pair的返回值也可以是2个数据。

template<class  T1,    class  T2 > struct pair;
其中,T1是first_type,T2是second_type。
1
2
有关pair的描述,具体见下:

描述    成员1(T1)    成员2(T2)
成员类型    first_type    second_type
成员名    first    second
2.pair使用
2.1成员函数(构造函数、赋值函数)
构造函数    描述
pair();    ①默认构造函数。值初始化 pair 的两个元素 first 和 second。
pair( const T1& x, const T2& y );    ②以 x 初始化 first 并以 y 初始化 second。
template< class U1, class U2 >pair( U1&& x, U2&& y );    以 std::forward(x) 初始化 first 并以 std::forward(y) 初始化 second。
template< class U1, class U2 >constexpr pair( pair<U1, U2>& p );    ③以 p.first 初始化 first 并以 p.second 初始化 second。
template< class U1, class U2 >pair( const pair<U1, U2>& p );    以 p.first 初始化 first 并以 p.second 初始化 second。
template< class U1, class U2 >pair( pair<U1, U2>&& p );    以std::forward(p.first) 初始化 first 并以 std::forward(p.second) 初始化 second。
template< class U1, class U2 >constexpr pair( const pair<U1, U2>&& p );    以 std::forward(p.first) 初始化 first 并以 std::forward(p.second) 初始化 second。
pair& operator=( const pair& other );    ④复制赋值运算符。以 other 内容的副本替换内容。
template< class U1, class U2 >pair& operator=( const pair<U1, U2>& other );    ⑤赋值 other.first 给 first , other.second 给 second 。
pair& operator=( pair&& other );    ⑥移动赋值运算符。用移动语义以 other 的内容替换内容。
template< class U1, class U2 >pair& operator=( pair<U1, U2>&& other );    ⑦赋值 std::forward(p.first) 给 first , std::forward(p.second) 给 second 。
|
1
#include <iostream>
#include <utility>
#include <vector>

using namespace std;

int main()
{
    pair<int, string> p1;//①默认构造函数
    cout << "p1.first: " << p1.first << "   p1.second : " << p1.second << endl;

    pair<int, int> p2{ 1,3 };//②以1初始化first并以3初始化 second
    cout << "p2.first: " << p2.first << "   p2.second : " << p2.second << endl;

    pair<int, int> p3{ p2 };//③以p.first初始化first并以p.second初始化second。
    cout << "p3.first: " << p3.first << "   p3.second : " << p3.second << endl;

    pair<int, string> p4{ 3,"Hello World" };
    p1 = p4;//④复制赋值运算符。以 other 内容的副本替换内容。
    cout << "p1.first: " << p1.first << "   p1.second : " << p1.second << endl;

    pair<int, vector<int>> p5{ 1,{1,3,5} }, p6{ 2,{2,4,6} };
    p5 = move(p6);//⑦operator=( pair<U1,U2>&& other );
    cout << "p5.first: " << p5.first  << endl;
    cout << "p6.first: " << p6.first << endl;

    return 0;
}

————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/qq_44423388/article/details/127886000

接下来嘛...上题!

伊利亚按照以下规则玩纸牌游戏。

一个玩家有几张牌。每张卡片都包含两个非负整数,一个在卡片的顶部,一个在底部。在回合开始时,玩家选择他的一张牌来玩。如果卡片顶部包含数字一个我,底部包含数字b我,然后当玩家在打牌时,他会得到一个我积分,还有机会玩额外的游戏b我卡。打完牌后,牌被丢弃。

更正式地说:假设有一个可以玩的牌柜台。在回合开始时,计数器等于 1。当打出一张牌时,打出的牌的计数器减少 1 并增加数字b我,写在卡片的底部。然后打出的牌被丢弃。如果在此之后计数器不等于零,则玩家有机会从剩余的牌中打出另一张牌。当计数器达到零或玩家用完牌时,回合结束。

当然,伊利亚希望获得尽可能多的积分。你能确定他能得分的最高分吗?

输入
第一行包含一个整数 n(1 ≤ n ≤ 1000)——Ilya 拥有的卡片数量。

接下来的 n 行中的每一行都包含两个非负空格分隔的整数 —一个我和b我 (0 ≤和我、乙我 ≤ 104) — 数字,分别写在第 i 张卡的顶部和底部。

输出
打印单个数字 — 根据所述规则,您在一轮中可以获得的最大分数。

提交途径在这:
https://codeforces.com/problemset/problem/155/B
https://codeforces.com/problemset/problem/155/B

这是答案:

#include <bits/stdc++.h>
using namespace std;
#define fr(i,a,b) for(int i=a;i<b;i++)
int n,b,c=1,ans;
pair<int,int> a[1111];
int main(){
    cin>>n;
    fr(i,0,n)
        cin>>a[i].second>>a[i].first;
    sort(a,a+n);
    reverse(a,a+n);
    while(c>0){
        if(b==n)
            break;
        ans+=a[b].second;
        c+=a[b].first;
        c--;
        b++;
    }
    cout<<ans;
    return 0;
}

还有几题:

小明买咖啡,咖啡是两种口味混一起的,他可以随意配两种。输入第一和第二种口味所有候选可能各自的数量,yummy值与购买所需的钱数。现在他要买最美味的,但是,包装上只呈现出第一种口味,所以他不会买第一种口味的yummy值最低的组合。按照这种买法,他用最多9元买到的组合的yummy值之和最大为多少,要多少钱?

0<数量<100000

-1<yummy值<100

-1<单价<10

样例:

3        数量

1 2 3        yummy值

3 4 4       钱数

2        数量

3 7        yummy值

5 7        钱数

ans:6(3+3),9(4+5)

⭐然后是这题:

--------------------atcoder_abc201_B--------------------

B - Do you know the second highest mountain? (atcoder.jp)
https://atcoder.jp/contests/abc201/tasks/abc201_b

这上面是我之前的文章里讲过的,放这里了。

还有底下这题:

--------------------L2-042 老板的作息表--------------------

新浪微博上有人发了某老板的作息时间表,表示其每天 4:30 就起床了。但立刻有眼尖的网友问:这时间表不完整啊,早上九点到下午一点干啥了?

本题就请你编写程序,检查任意一张时间表,找出其中没写出来的时间段。

输入格式:
输入第一行给出一个正整数 N,为作息表上列出的时间段的个数。随后 N 行,每行给出一个时间段,格式为:

hh:mm:ss - hh:mm:ss

其中 hh、mm、ss 分别是两位数表示的小时、分钟、秒。第一个时间是开始时间,第二个是结束时间。题目保证所有时间都在一天之内(即从 00:00:00 到 23:59:59);每个区间间隔至少 1 秒;并且任意两个给出的时间区间最多只在一个端点有重合,没有区间重叠的情况。

输出格式:
按照时间顺序列出时间表中没有出现的区间,每个区间占一行,格式与输入相同。题目保证至少存在一个区间需要输出。

输入样例:
8
13:00:00 - 18:00:00
00:00:00 - 01:00:05
08:00:00 - 09:00:00
07:10:59 - 08:00:00
01:00:05 - 04:30:00
06:30:00 - 07:10:58
05:30:00 - 06:30:00
18:00:00 - 19:00:00

输出样例:
04:30:00 - 05:30:00
07:10:58 - 07:10:59
09:00:00 - 13:00:00
19:00:00 - 23:59:59

AC代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin>>n;
    vector<pair<string,string>>pr;
    string s1,s2;
    char c;
    for(int i=0;i<n;i++)
    {
        cin>>s1>>c>>s2;
        pr.push_back({s1,s2});
    }
    pr.push_back({"23:59:59",""});
    pr.push_back({"","00:00:00"});
    sort(pr.begin(),pr.end());
    for(int i=0;i<pr.size()-1;i++)
    {
        if(pr[i].second!=pr[i+1].first)
            cout<<pr[i].second<<" - "<<pr[i+1].first<<endl;
    }
}

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/H1727548/article/details/130745843

(不好意思啊,这题转载的,链接好像废了,复制一下应该还能用)

这题可以用两个pair<string,string>来做,如果第一个pair(以下简称a)的second==第二个pair(以下简称b)的first,a.second()=b.second(),然后b再接新的一组,如果对不上,就把a存到vector里边去,清空a与b,重新开始。

如果各位有兴趣,可以参考一下这几位大佬的原文:

C++中pair用法_c++ pair-CSDN博客

C++中的pair用法_c++ pair-CSDN博客

C++——pair用法总结_c++ pair-CSDN博客

关于pair的学习圆满结束,我们下期再见!

  • 35
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PairC++ STL中的一个模板类,用于将两个值(可以是不同类型)组合成一个单元。Pair 类型的对象可以在需要一组有序数据时使用,例如将两个数据项存储在一个数据结构中。 Pair 通常用于以下场景: 1. 返回两个值的函数 2. 处理两个值的函数 3. 存储两个值的数据结构 4. 对于需要将键值对映射到一个值的场景 Pair 的语法如下: ``` template <class T1, class T2> struct pair; ``` 其中,T1 和 T2 是要组合成 Pair 类型的两个值的类型。使用 Pair 类型的对象需要引入头文件 <utility>。 例如,以下代码演示了 Pair 的基本用法: ```c++ #include <iostream> #include <utility> using namespace std; int main() { pair<int, string> p1(1, "one"); pair<int, string> p2 = make_pair(2, "two"); cout << "p1: " << p1.first << " " << p1.second << endl; cout << "p2: " << p2.first << " " << p2.second << endl; p1.first = 3; p1.second = "three"; cout << "p1 after update: " << p1.first << " " << p1.second << endl; return 0; } ``` 输出结果为: ``` p1: 1 one p2: 2 two p1 after update: 3 three ``` 在这个例子中,我们创建了两个 Pair 类型的对象 p1 和 p2,它们分别包含一个整数和一个字符串。我们还演示了如何使用 make_pair 函数来创建一个 Pair 类型的对象,make_pair 函数会自动推导出两个值的类型。我们还修改了 p1 对象的值,并输出了更新后的值。 总之,Pair 类型提供了一种方便的方法,可以将两个值组合成一个单元,可以方便地处理和存储这些值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值