map以自定義型別當key(鍵值)
——by mh1026
www.libcl.cn
今天,在公司的群裡有人問及關於map的鍵值能www.libcl.cn否使用自定義型別(類或者結構)。當時我也不清楚,所以回來學習一下。
關於map的定義:
namespace
std
第乙個template引數被當做元素的key,第二個template引數被當作元素的value。map的元素型別key和t,必須滿足以下兩個條件:
1.key/value必須具備assignable(可賦值的)和copyable(可複製的)性質。
2.對排序準則而言,key必須是comparable(可比較的)。
第三個template引數可有可無,用它來定義排序準則。這個排序準則必須定義為strict weak ordering。元素的次序由它們的key決定,和value無關。排序準則也可以用來檢查相等性:如果兩個元素的key彼此的都不小於對方,則兩個元素被視為相等。如果使用未傳入特定排序準則,就使用預設的less排序準則——以operator《來進行比較。
所謂「排序準則」,必須定義strict weak ordering,其意義如下:
1.必須是「反對稱性的」。
2.必須是「可傳遞的」。
3.必須是「非自反的」。
按照定義的要求:
我們有兩種方法以自定義型別當key:
1.為自定義型別過載operator<,map的第三個引數為預設仿函式less。
例子:#include
#include
#include
using
namespace
std;
class
test
;bool
test::operator<(
const
test& a)
const
}int
main()
2.不使用map的第三個引數為預設仿函式less,自己編寫乙個比較仿函式。
#include
#include
using
namespace
std;
struct
keyofmap
;struct
mymapfunctor
};int
main()
{maptest;
keyofmap temp1;
keyofmap temp2;
temp1.firstofkey = 1;
temp1.secondofkey = 1;
temp2.firstofkey = 2;
temp2.secondofkey = 2;
test.insert(make_pair(temp1,
"first"
));test.insert(make_pair(temp2,
"second"
));map::iterator begin = test.begin();
cout << begin->first.firstofkey << begin->first.secondofkey << begin->second << endl;
return1;}
map以自定義型別當Key(鍵值)
map以自定義型別當key 鍵值 by mh1026 www.libcl.cn 今天,在公司的群裡有人問及關於map的鍵值能www.libcl.cn否使用自定義型別 類或者結構 當時我也不清楚,所以回來學習一下。關於map的定義 namespace std 第乙個template引數被當做元素的ke...
map以自定義型別當Key(鍵值)
今天,在公司的群裡有人問及關於map的鍵值能www.libcl.cn否使用自定義型別 類或者結構 當時我也不清楚,所以回來學習一下。關於map的定義 namespace std 第乙個template引數被當做元素的key,第二個template引數被當作元素的value。map的元素型別key和t...
Map以自定義類做為鍵值
map在stl中的定義 template class alloc alloc 第乙個引數key是關鍵字型別 第二個引數t是值型別 第三個引數compare是比較函式 仿函式 第四個引數是記憶體配置物件 map內部儲存機制實際是以紅黑樹為基礎,紅黑樹在插入節點時,必須依照大小比對之後在乙個合適的位置上...