map自定義比較函式

2021-07-07 10:48:33 字數 2431 閱讀 5800

from:

template , class alloc = alloc>

第乙個引數key是關鍵字型別

第二個引數t是值型別

第三個引數compare是比較函式(仿函式)

第四個引數是記憶體配置物件

map中的關鍵字,起碼必須有「<」這個比較操作符。我們知道,int,float,enum,size_t等等簡單關鍵字,都有內建的比較函式,與map搭配無論是插入還是查詢,都沒什麼問題。但是作為複雜資料型別,如果沒有明確定義「<」比較操作符,就不能與map直接搭配使用,除非我們自己定義第三個引數。

在選擇map的關鍵字時,注意以下兩點:

a) 關鍵字明確定義「<」比較操作符

b) 沒有「<」比較操作符,自定義仿函式替代第三個引數compare,該仿函式實現「()」操作符,提供比較功能。插入時各節點順序以該仿函式為綱。

一.             關鍵字明確定義「

<」比較操作符

以友聯函式代替函式內部定義的比較操作符,

operator

《為類的友元函式,**如下:

#include "stdafx.h"

#include

#include

#include

#include

using

namespace std;

struct mycomp

;mycomp(int aa, int bb, int cc):a(aa), b(bb), c(cc){};

friend

bool

operator

< (const mycomp &la, const mycomp&lb);

};inline

bool

operator

< (const mycomp &la, const mycomp &lb)

int _tmain(int argc, _tchar* argv)

;cout<<(iter->first).a<<" "<<(iter->first).b<<" "<<(iter->first).c<<" "getchar();

return 0;

}operator

《函式中,返回的是「<」的比較結果,所以最終的結果也是從小到大排列。如果返回「>」的比較結果,那麼最終是以從大到小排列。如果最後一步返回true,那麼會出現a、b、c值完全相同時,也可以同時插入map。

以成員函式定義

operator

<,operator

《函式必須為const,**如下:

#include "stdafx.h"

#include

#include

#include

#include

using

namespace std;

struct mycomp

;mycomp(int aa, int bb, int cc):a(aa), b(bb), c(cc){};

bool

operator

< (const mycomp &lb) const ;

};int _tmain(int argc, _tchar* argv)

;cout<<(iter->first).a<<" "<<(iter->first).b<<" "<<(iter->first).c<<" "getchar();

return 0;

二.             自定義仿函式替代第三個引數

所謂的仿函式(functor),是通過過載()運算子模擬函式形為的類。

因此,這裡需要明確兩點:

1 仿函式不是函式,它是個類;

2 仿函式過載了()運算子,使得它對你可以像函式那樣子呼叫(**的形式好像是在呼叫函式)。

#include "stdafx.h"

#include

#include

#include

#include

using

namespace std;

struct mycomp

;mycomp(int aa, int bb, int cc):a(aa), b(bb), c(cc){};

};struct clow

};int _tmain(int argc, _tchar* argv)

;cout<<(iter->first).a<<" "<<(iter->first).b<<" "<<(iter->first).c<<" "getchar();

return 0;

其中clow是乙個結構體,但是作為map的第三個引數傳遞過去之後,又因為過載了()操作符,使得clow這個結構體的用法像函式一樣,這就是仿函式。

參照:

map和set容器自定義比較函式

將元素插入map和set中時,容器會根據設定的比較函式將該元素放到相應節點上,在定義容器時,如果沒有指定比較函式,那麼採用預設的比較函式,及按照鍵值由小到大的順序插入元素,很多情況下,需要自己編寫比較函式,map和set內部的資料結構都是紅黑樹,所以比較函式是一致的,編寫方法有兩種 1 如果元素不是...

自定義比較函式mystrcmp

實現乙個兩字串比較的函式 mystrcmp 不允許呼叫標準庫中的字串處理函式。當兩字串相等時,該函式返回 0 當第乙個字串大於第二字串時,該函式返回 1 當第乙個字串小於第二字串時,該函式返回 1。輸入格式 兩行,每行乙個字串,每個字串的長度不超過30。輸出格式 根據兩字串的大小,對應輸出 0,1,...

自定義lower bound比較函式

過載比較符號或者自定義比較函式均可。記得比較的時候需要放結構體進去比較。如用vetor存結構體比較或者直接結構體比較。include include include include include include include include include include include inc...