2013-06-26 57 views
0

我自定義std :: map中的比較如下。std :: map :: erase(const key_type&)比較定製後停止工作

class my_cmp { 
public: 
    bool operator()(const string &a, const string &b) { 
    return (a.length() >= b.length()); 
    } 
}; 

map<string, int, tmp_cmp> tmp;適用於每個字符串長度的所有鍵排序。但tmp.erase("a string");不再有效。定製比較後,是否有解決方案可以使std :: map :: erase(key_type)仍然有效?

+0

我的地圖鍵可以有相同的長度。這就是我的期望。但是,即使我更改爲 'class my_cmp { public: bool operator()(const string&a,const string&b){if(length)== b.length()) return(a b.length()); } };' – CGor

回答

2

std::map中的自定義比較器必須與「less」運算符具有相同的行爲。所以,你必須改變你的代碼return (a.length() < b.length());

+0

是的。其實{if(a.length()== b.length())return(a b.length()); }的作品。謝謝。 – CGor

2

@乍得的評論拋開一邊,我認爲你的問題是,你的實施包括=

map對等式的定義是!less(a,b) && !less(b,a)。這對於您的less的定義不起作用。

這裏是什麼標準說,在「23.2.4關聯容器」

3短語「鍵對等」是指通過對鍵的比較,而不是運營商==實行的等價關係 。也就是說,兩個 鍵k1和k2被認爲是等價的,如果用於比較,則爲 object comp,comp(k1,k2)== false & & comp(k2,k1)== false。對於任何 兩個鍵k1和k2在同一個容器中,調用comp(k1,k2)應始終返回相同的值 。

+0

有趣,謝謝! – CGor

+0

順便說一句,我在哪裏可以找到地圖的平等定義? – CGor

+0

編輯答案以包含標準參考。 – Arkadiy

1

地圖比較器必須強加嚴格的弱排序。部分意思是comp(a,b)comp(b,a)不能同時爲真。所以比較應該更像<>而不是像<=>=