https://blog.csdn.net/qian2213762498/article/details/81773289
C++ pair(含pair排序)
pair 默认对first升序,当first相同时对second升序;
类模板:template <class T1, class T2> struct pair
参数:T1是第一个值的数据类型,T2是第二个值的数据类型。
功能:pair将一对值组合成一个值,这一对值可以具有不同的数据类型(T1和T2),两个值可以分别用pair的两个公有函数first和second访问。
具体用法:
1.定义(构造):
pair<int, double> p1; //使用默认构造函数
pair<int, double> p2(1, 2.4); //用给定值初始化
pair<int, double> p3(p2); //拷贝构造函数
2.访问两个元素(通过first和second):
pair<int, double> p1; //使用默认构造函数
p1.first = 1;
p1.second = 2.5;
cout << p1.first << ' ' << p1.second << endl;
输出结果:1 2.5
3.赋值operator = :
(1)利用make_pair:
pair<int, double> p1;
p1 = make_pair(1, 1.2);
(2)变量间赋值:
pair<int, double> p1(1, 1.2);
pair<int, double> p2 = p1;
可以用cmp数组改;
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define mem(x,y) memset(x,y,sizeof(x))
using namespace std;
typedef long long LL;
const int INF=0x3f3f3f3f;
pair<int,int>pa[100];
int cmp(pair<int,int>a,pair<int,int>b){
if(a.first!=b.first)return a.first>b.first;
else return a.second<b.second;
}
int main(){
int a,b;
for(int i=0;i<5;i++)scanf("%d%d",&a,&b),pa[i]=make_pair(a,b);
sort(pa,pa+5,cmp);
for(int i=0;i<5;i++)printf("%d %d\n",pa[i].first,pa[i].second);
return 0;
}
C++对一组pair数据进行排序(sort函数的使用)
最近在写一个算法的时候,把一些数据存在了pair中,并且需要根据pair中first或者second的值对这些数据进行排序。比如:输入数据(1,2)、(4,2)、(3,3)、(2,1)根据first的值大小进行升序排序,输出(1,2)、(2,1)、(3,3)、(4,2)。
经过思索之后得到的实现方法如下:
首先将这些数据存在vector数组中,vector<pair<int,int>>vec;
然后使用sort函数对数组进行排序,这里就涉及到了sort函数的使用了。
下面是sort函数使用方法
函数声明:
template <class RandomAccessIterator>
void stable_sort ( RandomAccessIterator first, RandomAccessIterator last );
template <class RandomAccessIterator, class Compare>
void stable_sort ( RandomAccessIterator first, RandomAccessIterator last,
Compare comp );
参数解释:
(1)第一个是要排序的数组的起始地址。
(2)第二个是结束的地址(最后一位要排序的地址的下一地址)。
(3)第三个参数是排序的方法,可以是从大到小也可是从小到大,还可以不写第三个参数,此时默认的排序方法是从小到大排序。
我们可以根据自己的需求自定义第三个参数cmp函数,比如若要对整型数组降序排序,则可以这样来写cmp函数:
bool cmp(int a, int b)
{
return a>b;//升序则为a<b
}
这个cmp参数使用起来非常方便,因为它正好能解决我们的pair排序问题。
我们只要根据数组中的元素类型定义cmp函数的参数,并且根据需求定义函数体
bool cmp(pair<int, int>a, pair<int, int>b)
{
return a.first<b.first;//根据fisrt的值升序排序
//return a.second<b.second;//根据second的值升序排序
}
然后调用sort函数sort(vec.begin(),vec.end(),cmp)。
便可以根据pair中first的值进行升序排序。
下面是具体代码实现
#include "stdafx.h"
#include <iostream>
#include <vector>
#include<algorithm>
using namespace std;
//根据first的值升序排序
bool cmp1(pair<int,int>a,pair<int,int>b)
{
return a.first < b.first;
}
//根据second的值升序排序
bool cmp2(pair<int, int>a, pair<int, int>b)
{
return a.second < b.second;
}
int main()
{
vector<pair<int, int>>vec;
vec.push_back({ 1,2 });
vec.push_back({ 4,2 });
vec.push_back({ 3,3 });
vec.push_back({ 2,1 });
sort(vec.begin(), vec.end(), cmp1);
cout << "根据first的值升序排序:" << endl;
for (auto it = vec.begin();it != vec.end();it++)
{
cout << "(" << it->first << "," << it->second << ")" << endl;
}
sort(vec.begin(), vec.end(), cmp2);
cout << "根据second的值升序排序:" << endl;
for (auto it = vec.begin();it != vec.end();it++)
{
cout << "(" << it->first << "," << it->second << ")" << endl;
}
}
运行截图
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
以下内容为原创:
自己又写了几个测试的小例子,加深理解。
test case1
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int nmax=200000+10;
pair<int,int>a[nmax];
int main(int argc, char** argv) {
int t;
while(cin>>t){
int n;//任务数
int m;//人数
while(t--){
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>a[i].first>>a[i].second;
}
sort(a,a+n);//按照first左边排序
for(int i=0;i<n;i++){
cout<<a[i].first<<" "<<a[i].second<<endl;
}
}
}
return 0;
}/*
1
4 3
3 1
2 4
1 6
4 7
------
1 6
2 4
3 1
4 7
*/
test case2
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int nmax=200000+10;
pair<int,int>a[nmax];
int main(int argc, char** argv) {
int t;
while(cin>>t){
int n;//任务数
int m;//人数
while(t--){
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>a[i].second>>a[i].first;
}
sort(a,a+n);//按照firs右排序
for(int i=0;i<n;i++){
cout<<a[i].second<<" "<<a[i].first<<endl;
}
}
}
return 0;
}/*
1
4 3
3 1
2 4
1 6
4 7
-----
3 1
2 4
1 6
4 7
*/
升序的话,直接排序,默认先比第一关键字,在比第二关键字
写得很棒呀!咋没人看呢