set和map容易都是關聯式容器,可以實現自動排序,而其中的排序函數默認是按照從小到大的順序(或字典序)進行排序操作,我們可以根據數據類型的不同,自己設置排序函數,進而控制set和map容器的排序和輸出結果。
其中設置排序函數,可以使用庫函數,也可以自行定義。
以下代碼分別給出了庫函數,自定義排序函數(重載()運算符)的使用方法:
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <set>
#include <map>
using namespace std;
class MySetCmp
{
public:
// 重載()操作符,記住函數後加const,表示此函數不會對數據進行修改
// 指明瞭這個函數不會修改該類的任何成員數據的值,稱爲常量成員函數。
bool operator()(const int& a, const int& b) const
{
return a > b;
}
};
int main()
{
// set, 從大到小排序, 使用庫函數
set<int, greater<int>> s1{ 1,2,3,4 };
cout << "s1 : ";
for (auto i : s1)
{
cout << i << " "; // 4 3 2 1
}
cout << endl;
// set, 從大到小排序, 使用自定義函數
set<int, MySetCmp> s2{ 1,2,3,4 };
cout << "s2 : ";
for (auto i : s2)
{
cout << i << " "; // 4 3 2 1
}
cout << endl;
// map, 根據key值,從大到小排序, 使用庫函數
map<int, int, greater<int>> m1{ {1,4},{2,3},{3,2},{4,1} };
cout << "m1 : ";
for (auto i : m1)
{
cout << i.first << " "; // 4 3 2 1
}
cout << endl;
// map, 根據key值,從大到小排序, 使用庫函數
map<int, int, MySetCmp> m2{ {1,4},{2,3},{3,2},{4,1} };
cout << "m2 : ";
for (auto i : m2)
{
cout << i.first << " "; // 4 3 2 1
}
cout << endl;
return 0;
}
函數執行結果:
s1 : 4 3 2 1
s2 : 4 3 2 1
m1 : 4 3 2 1
m2 : 4 3 2 1
C++還提供了其它比較函數可供使用,比如:
- less():小於
- less_equal():小於等於
- greater():大於
- greater_equal():大於等於
- equal(): 等於
等等,其它函數。
另外,對於自定義類型的數據,我們一般都需要自行定義比較函數來進行排序操作,因此我們可以根據自定義數據的特點,去重載()運算符,然後在函數內部實現自己的比較邏輯。
謝謝閱讀。