1. 程式人生 > >C++ 自定義二元謂詞函式的寫法

C++ 自定義二元謂詞函式的寫法

對於優先順序佇列priority_queue,注意預設的是less函式,優先順序佇列是大數在佇列頭,若想要小數在佇列頭部,需要greater
但是對於自定義的二元謂詞函式應該是過載()運算子,或者使用仿函式

struct cmp 
{
    bool operator()(pair<int, int>& a, pair<int, int>& b)
    {
        if (a.first == b.first)
            return a.second > b.second;
        else
            return
a.second < b.second; } }; int main() { priority_queue<pair<int, int>, vector<pair<int,int>>, cmp> que; }

對於set應該這麼寫:
需要注意的是set預設使用less得到的將是從小到大的排列,使用great得到的是從大到小的排列,這個和優先順序佇列相反

struct cmp 
{
    bool operator() (int a, int b) 
    {
        if (a < b)
            return
true; else return false; } }; int main() { set<int, cmp> ss; multiset<int, greater<int>> ms; for (int i = 0; i < 10; i++) { ss.insert(i); ms.insert(i); ms.insert(i + 1); } for (int i : ss) cout << i << " "
; cout << endl; for (int i : ms) cout << i << " "; cout << endl; system("pause"); }

對於map呢?
需要注意的是cmp函式是const函式,所以後面的const是必須要的
參考這個部落格
[C/C++]map自定義比較函式

struct cmp
{
    bool operator() (int a, int b) const
    {
        if (a < b)
            return true;
        else
            return false;
    }
};


int main()
{
    map<int, int,cmp> mp;
    multimap<int, int,cmp> mmp;

    for (int i = 0; i < 10; i++)
        mp[i] = i;

    for (auto i : mp)
        cout << i.first << "   ";
    cout << endl;

    system("pause");
}

主要就是過載小於<運算子,注意這裡實在類中過載的

#include<iostream>
#include<stdio.h>
#include<map>
class A
{
public:
    A(int a) :a_(a) {}
    bool operator<(A BObj) const {
        return a_<BObj.a_;
    }
private:
    int a_;
};
int main()
{
    std::multimap<A, std::string> mapTest;
    mapTest.insert(std::make_pair(A(4), "zsy"));
    mapTest.insert(std::make_pair(A(2), "qwe"));
    mapTest.insert(std::make_pair(A(1), "asd"));
    mapTest.insert(std::make_pair(A(3), "qwe"));
    auto it = mapTest.begin();
    for (; it != mapTest.end(); it++)
    {
        printf("%s\n", it->second.c_str());
    }
    system("pause");
    return 0;

}