Map以自定義類做為鍵值

2021-05-25 02:06:07 字數 1282 閱讀 7239

map在stl中的定義

template , class alloc = alloc>

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

第二個引數t是值型別

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

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

map內部儲存機制實際是以紅黑樹為基礎,紅黑樹在插入節點時,必須依照大小比對之後在乙個合適的位置上執行插入動作。所以作為關鍵字,起碼必須有「<」這個比較操作符。我們知道,int,float,enum,size_t等等簡單關鍵字,都有內建的比較函式,與map搭配無論是插入還是查詢,都沒什麼問題。但是作為複雜資料型別,如果沒有明確定義「<」比較操作符,就不能與map直接搭配使用,除非我們自己定義第三個引數。

在選擇map的關鍵字時,注意以下兩點,同時這兩點也是改錯的方法:

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

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

以std::pair為關鍵字摻入map

下面我們先寫乙個有錯誤的函式,在分析錯誤原因之後,逐步進行修正。

#include

int main()

這個程式一定失敗,如果非要如此使用,上述a方法顯然不適合,std::pair是已定義好的結構體不可修改。只能使用b方法了,定義乙個比較類改造如下:

<」比較函式。因為struct st是我們自己定義的結構體,所以修改這個程式可以使用上面a、b兩種方法。我們先談第一種,第一次修改時我也搞錯了,我是這樣定義比較函式的。

st(int x, int y):a(x), b(y){}

bool operator < (const struct st &rs) };

class key

;bool operator <(const key &key1,const key &key2)

{ if(key1._keyclassmap;

key one(1);

classmap.insert(make_pair(one,1));

key two(2);

classmap.insert(make_pair(two,2));

key three(3);

classmap.insert(make_pair(three,3));

map::iterator itor=classmap.begin();

while(itor!=classmap.end())

{ cout

Map以自定義類做為鍵值

map在stl中的定義 template class alloc alloc 第乙個引數key是關鍵字型別 第二個引數t是值型別 第三個引數compare是比較函式 仿函式 第四個引數是記憶體配置物件 map內部儲存機制實際是以紅黑樹為基礎,紅黑樹在插入節點時,必須依照大小比對之後在乙個合適的位置上...

Map以自定義類做為鍵值

資料出處 map在stl中的定義 template class alloc alloc 第乙個引數key是關鍵字型別 第二個引數t是值型別 第三個引數compare是比較函式 仿函式 第四個引數是記憶體配置物件 map內部儲存機制實際是以紅黑樹為基礎,紅黑樹在插入節點時,必須依照大小比對之後在乙個合...

Map以自定義類做為鍵值

map在stl中的定義 template class alloc alloc 第乙個引數key是關鍵字型別 第二個引數t是值型別 第三個引數compare是比較函式 仿函式 第四個引數是記憶體配置物件 map內部儲存機制實際是以紅黑樹為基礎,紅黑樹在插入節點時,必須依照大小比對之後在乙個合適的位置上...