1. 程式人生 > 其它 >C++ 修改預設排序方式(sort、set、map)

C++ 修改預設排序方式(sort、set、map)

技術標籤:C++排序演算法c++

Cpp中修改sort函式排序方式,是通過自擬函式實現的,如下程式碼所示:

bool myCompare(Person &p1, Person &p2)
{
    if(p1.m_Age == p2.m_Age)
    {
        return p1.m_Height > p2.m_Height;
    }
    return p1.m_Age < p2.m_Age;
}
sort(myCompare);

先對年齡進行升序排序,當年齡相同時,按照身高進行降序排序

那如何根據該思想修改Set容器內的預設排序呢?

Set容器在建立時就已經預設按升序排序了,所以要修改需要在宣告處動手腳,具體就是通過MyCompare()的過載(仿函式):示例如下,按照降序排序

#include <iostream>
#include <set>
using namespace std;
//仿函式
class MyCompare
{
public:
    bool operator()(int v1, int v2)
    {
        return v1 > v2;
    }
};
void test01()
{
    set<int,MyCompare> s1;
s1.insert(10); s1.insert(40); s1.insert(20); s1.insert(60); for(set<int,MyCompare>::iterator it = s1.begin(); it != s1.end(); it++) { cout << *it << " "; } cout << endl; }

結果:
在這裡插入圖片描述
上面是對內建資料型別,當然對自定義資料型別更是如此:

#include <iostream>
#include <set> using namespace std; class Person { public: Person(string name,int age) { this->m_Name = name; this->m_Age = age; } int m_Age; string m_Name; }; //仿函式 class MyCompare { public: bool operator()(const Person &p1, const Person &p2) { return p1.m_Age > p2.m_Age; } }; void test01() { set<Person,MyCompare> s1; Person p1("劉備", 24); Person p2("關羽", 28); Person p3("張飛", 25); Person p4("趙雲", 21); s1.insert(p1); s1.insert(p2); s1.insert(p3); s1.insert(p4); for(set<Person,MyCompare>::iterator it = s1.begin(); it != s1.end(); it++) { cout << (*it).m_Name << ":"<<(*it).m_Age<<endl; } }

在這裡插入圖片描述
map與set類似,通過仿函式實現(排序的依據為鍵值)