template class map其中_key表示比較的鍵(key),_tp表示值(value),_compare表示比較方式,_alloc表示記憶體分配器。
一般我們在寫map的時候總是類似於寫出如下**:
map* my_map = new map;表示鍵為int型別,值為字串型別。這裡之所以不對_compare和_alloc加以限制,是因為int是c++內建型別,有預設比較方式,_alloc也採用stl的
預設的記憶體方案。但是如果有如下結構體:
struct term;現在我們要將該term作為map的鍵,並假設term所對應的值為term出現的頻率(int型),那麼能不能這樣寫:
map* my_map = new map;顯然這樣寫map是無法正常運作的,原因是struct term並非c++的內建型別,預設不知道如何去比較它。這時候就需要修改map的預設比較方式:
template struct compare這裡採用的是函式物件(function object)的方式去載入map的比較方式,表示使用term的hashcode作為比較方式,以對紅黑樹進行查詢、插入等操作。};
這樣我們就可以把map寫成下面的形式:
map>* my_map = new map>;這樣map就可以正常運作了,比如進行插入操作:
term my_term;但是上面的struct compare為什麼要寫成這樣的形式,寫成這樣行不行:my_map->insert(make_pair(my_term, 1));
template struct compare這是不行的。為什麼不行,首先來看一看map中find的源**:};
template typename _rb_tree<_key>::iterator上面的**中_m_key_compare就表示我們的那個比較函式物件,_s_key(__x)表示取__x節點的key,並和__k比較。_rb_tree<_key>::find(const _key& __k)
if (!_m_key_compare(_s_key(__x), __k))表示如果_s_key(__x) >= __k即,如果節點的key大於或等於查詢的key那麼就__x就等於它的左子節點,否則就為右子節點。__y = __x, __x = _s_left(__x);
但為什麼等於的時候不直接返回呢,卻在繼續查詢?舉個例子來說:
如果我們要查詢key為10的節點是否在樹中時,首先從根節點開始查詢,由於8<10,這時_m_key_compare返回1,那麼此時,
轉向root的右子樹,然後由於10==10,_m_key_compare返回0,這時轉向左子樹,但左子樹是空的,迴圈停止。
return (__j == end() || _m_key_compare(__k, _s_key(__j._m_node))) ? end() : __j;由於此時__j表示"10"這個節點(其實是個迭代器),由於__k為10,而__j._m_node的key為10,_m_key_compare返回0,有三元運算子可知,
此時返回是__j,即表示找到了。因此我們的比較函式物件必需寫成:
當節點鍵大於等於所要查詢或插入的鍵時,返回0(false),反之為1(true),這是由內部源**所決定的。
STL中改變map的預設比較方式
大家知道,stl中的map底層是用紅黑樹實現的,其泛型原型如下 template class key,class tp,class compare,class alloc class map 其中 key表示比較的鍵 key tp表示值 value compare表示比較方式,alloc表示記憶體分...
STL中改變map的預設比較方式
大家知道,stl中的map底層是用紅黑樹實現的,其泛型原型如下 template class key,class tp,class compare,class alloc class map 其中 key表示比較的鍵 key tp表示值 value compare表示比較方式,alloc表示記憶體分...
STL中改變map的預設比較方式
大家知道,stl中的map底層是用紅黑樹實現的,其泛型原型如下 template class key,class tp,class compare,class alloc class map 其中 key表示比較的鍵 key tp表示值 value compare表示比較方式,alloc表示記憶體分...