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...