(1)sort(); 小于大于号重载; 对于int, char, string, pair, 结构体.
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
typedef pair<int, char> PIC;
// NO.2 sort()函数及排序函数 cmp 的定义
// sort() 降序排序
bool cmp(int a, int b)
{
return a > b;
}
// 第一关键字降序排序,第二关键字降序排序
bool cmp0(PIC &a, PIC &b)
{
if(a.first != b.first) return a.first > b.first;
return a.second > b.second;
}
// cmp() 函数体现的是两个对象的对比逻辑,并且和 数组内位置逻辑 传入位置逻辑 相关.
// 如下
// 第一关键字降序排序,第二关键字降序排序
bool cmp0_0(PIC &a, PIC &b)
{
if(a.first != b.first) return b.first < a.first;
return a.second > b.second;
}
// 第一关键字降序排序,第二关键字降序排序
bool cmp0_1(PIC &b, PIC &a)
{
if(a.first != b.first) return b.first > a.first;
return a.second < b.second;
}
// cmp0, cmp0_0, cmp0_1 三种输出都是: 5:d 3:e 2:c 2:a 1:a.
// 第一关键字降序排序,第二关键字升序排序
bool cmp1(PIC &a, PIC &b)
{
if(a.first != b.first) return a.first > b.first;
return a.second < b.second;
}
// cmp1 输出: 5:d 3:e 2:a 2:c 1:a
// NO.1 结构体定义及多关键字排序,大于号小于号重载
struct ICI
{
int a;
char b;
int c;
// 比较运算符重载
// 第一关键字降序,第二关键字升序,第三关键字升序
// sort() 函数使用 < 号来比较大小的,所以用sort()必须重载 < 号.
// 重载 < 号
bool operator < (const ICI &A) const
{
if(a != A.a) return a > A.a;
else if(b != A.b) return b < A.b;
else return c < A.c;
}
// 重载 > 号用于一般大于判断
bool operator > (const ICI &A) const
{
if(a != A.a) return a > A.a;
else if(b != A.b) return b > A.b;
else return c > A.c;
}
};
int main()
{
// NO.2 sort()函数及排序函数 cmp 的定义
{
vector<int> arr = {3, 1, 8, 5, 4, 0, 7, 9};
// sort()函数传入的是指针
// (1) 默认升序,从小到大
sort(arr.begin(), arr.end());
for(auto i : arr)
{
cout << i << ' ';
}
cout << endl;
// Output: 0 1 3 4 5 7 8 9
// (2) 降序排序
// sort(arr.rbegin(), arr.rend());
sort(arr.begin(), arr.end(), cmp);
for(auto i : arr)
{
cout << i << ' ';
}
cout << endl;
// Output: 9 8 7 5 4 3 1 0
// (3) pair< , > 关键字排序
vector<pair<int, char>> vp0 = {{2, 'a'}, {2, 'c'}, {1, 'a'}, {5, 'd'}, {3, 'e'}};
// cmp() 以第一关键字降序排序,以第二关键字降序排序
sort(vp0.begin(), vp0.end(), cmp0_1);
for(auto item : vp0)
{
cout << item.first << ':' << item.second << ' ';
}
cout << endl;
// Output: 5:d 3:e 2:c 2:a 1:a
vector<pair<int, char>> vp1 = {{2, 'a'}, {2, 'c'}, {1, 'a'}, {5, 'd'}, {3, 'e'}};
// cmp() 以第一关键字降序排序,以第二关键字降序排序
sort(vp1.begin(), vp1.end(), cmp1);
for(auto item : vp1)
{
cout << item.first << ':' << item.second << ' ';
}
cout << endl;
// Output: 5:d 3:e 2:a 2:c 1:a
}
// NO.1 结构体定义及多关键字排序,大于号小于号重载
// 第一关键字升序,第二关键字升序,第三关键字升序
vector<ICI> v_ICI = {{3, 'a', 2}, {2, 'b', 1}, {3, 'a', 1}, {3, 'b', 5}, {5, 'd', 2}};
sort(v_ICI.begin(), v_ICI.end());
for(auto item : v_ICI)
{
cout << item.a << " : " << item.b << " : " << item.c << " ";
}
// 通过重载的小于号大于号判断
if(v_ICI[0] < v_ICI[1]) cout << "Yes";
else cout << "NO";
if(v_ICI[0] > v_ICI[2]) cout << "Yes ";
if(v_ICI[1] > v_ICI[2]) cout << "Yes ";
else cout << "NO ";
return 0;
}