为了实现自定义数据类型(或者是内置数据类型)按照自己的排序规则进行排序,我们需要自己定义排序函数,这就需要用到回调函数或者仿函数或者lambda表达式。
1、回调函数,直接上程序。
#include<iostream>
#include<algorithm>
#include<vector>
#include<utility>
using namespace std;
//回调函数
bool func (pair<int, int >& a, pair<int, int >& b)
{
if (a.second != b.second)//如果第二个数不想打呢个,按照第二个数从小到大排序
return a.second < b.second;
return a.first < b.first;//否则相同的按照第一个从小到大排序
}
int main()
{
vector<pair<int, int>> ret;
pair<int, int >p(1,0);
pair<int, int >p1(1,5);
pair<int, int >p2(0, 5);
pair<int, int >p3(2, 5);
pair<int, int >p4(1, 4);
ret.push_back(p);
ret.push_back(p1);
ret.push_back(p2);
ret.push_back(p3);
ret.push_back(p4);
sort(ret.begin(), ret.end(), func);//回调函数
for(auto p:ret)
{
cout << p.first <<" "<< p.second << endl;
}
cout << endl;
return 0;
}
输出结果:
//整体按照第二个数从小到大排序,第二个相等则按照第一个数从小到大排序
1 0
1 4
0 5//第二个都是5,按照第一个从小到大排序
1 5
2 5
2、仿函数,直接贴程序
#include<iostream>
#include<algorithm>
#include<vector>
#include<utility>
using namespace std;
//仿函数,重载小括号()
struct
{
bool operator() (pair<int, int >& a, pair<int, int >& b)
{
if (a.second != b.second)//这里只能用相等或者不等号,否则会出错。
return a.second < b.second;
return a.first < b.first;
}
}cmp;
int main()
{
vector<pair<int, int>> ret;
pair<int, int >p(1,0);
pair<int, int >p1(1,5);
pair<int, int >p2(0, 5);
pair<int, int >p3(2, 5);
pair<int, int >p4(1, 4);
ret.push_back(p);
ret.push_back(p1);
ret.push_back(p2);
ret.push_back(p3);
ret.push_back(p4);
sort(ret.begin(), ret.end(), cmp);
for(auto p:ret)
{
cout << p.first <<" "<< p.second << endl;
}
cout << endl;
return 0;
}
输出结果
1 0
1 4
0 5
1 5
2 5
3、lambda表达式,lambda表达式的用法:[](数据类型 a,数据类型 b){函数实现内容} 下面是用lambda表达式来定义自己的排序规则。
#include<iostream>
#include<algorithm>
#include<vector>
#include<utility>
using namespace std;
int main()
{
vector<pair<int, int>> ret;
pair<int, int >p(1,0);
pair<int, int >p1(1,5);
pair<int, int >p2(0, 5);
pair<int, int >p3(2, 5);
pair<int, int >p4(1, 4);
ret.push_back(p);
ret.push_back(p1);
ret.push_back(p2);
ret.push_back(p3);
ret.push_back(p4);
//lambda表达式定义排序规则
sort(ret.begin(), ret.end(),[](pair<int, int >a, pair<int, int >b)
{ if (a.second != b.second) return a.second < b.second; else return a.first < b.first;});
//输出
for(auto p:ret)
{
cout << p.first <<" "<< p.second << endl;
}
cout << endl;
return 0;
}
输出结果
1 0
1 4
0 5
1 5
2 5