STL中set和map容器設置排序函數:自定義或使用庫函數

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++還提供了其它比較函數可供使用,比如:

  1. less():小於
  2. less_equal():小於等於
  3. greater():大於
  4. greater_equal():大於等於
  5. equal(): 等於

等等,其它函數。

另外,對於自定義類型的數據,我們一般都需要自行定義比較函數來進行排序操作,因此我們可以根據自定義數據的特點,去重載()運算符,然後在函數內部實現自己的比較邏輯。

謝謝閱讀。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章