记得上次讲了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,重新开始。
如果各位有兴趣,可以参考一下这几位大佬的原文:
关于pair的学习圆满结束,我们下期再见!