【C++】自定義比較函數小結


1、使用結構體grid作為map的key

struct grid
{
    int x;
    int y;
};

(1)需要自定義比較函數operator<,不然會報錯:

error C2784: “bool std::operator <(const std::deque<_Ty,_Alloc> &,const std::deque<_Ty,_Alloc> &)”: 未能從“const grid”為“const std::deque<_Ty,_Alloc> &”推導 模板 參數

(2)需要定義為const成員函數,不然會報錯:

error C2678: 二進制“<”: 沒有找到接受“const grid”類型的左操作數的運算符(或沒有可接受的轉換)

(3)需要確定唯一序

如果只寫

return x<g.x

那么對於(1,2)和(1,1),比較結果為(1,2)<(1,1)並且(1,1)<(1,2),然而顯然兩者並不相等。

 

正確的定義方法為:

struct grid
{
    int x;
    int y;
    bool operator<(const grid& g)
    {//define operator for custom key
        if(x != g.x)
            return x < g.x;
        else
            return y < g.y;
    }
};

 

2、自定義標准庫函數sort的compare

(1)compare函數中,如果是升序,必須是<而不是<=,否則出現相同元素時會運行錯誤:

解釋:參考http://www.cplusplus.com/reference/list/list/sort/,比較必須產生strick weak ordering。

對於strick weak ordering 可以參考http://stackoverflow.com/questions/979759/operator-and-strict-weak-ordering/981299#981299

的詳細說明。

總之,如果a,b不等,那么compare(a,b)和compare(b,a)其中之一為true,另一為false。

如果a,b相等,則都應該為false。

(2)compare函數必須聲明為靜態成員函數或者全局函數,不能作為普通成員函數,不然會報錯:

error C3867: “Solution::compare”: 函數調用缺少參數列表;請使用“&Solution::compare”創建指向成員的指針

解釋:非靜態成員函數是依賴於具體對象的,而std::sort這類函數是全局的,因此無法在sort中調用非靜態成員函數。

可以把compare改成靜態或者全局函數,使之不依賴於具體對象。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM