我在std :: map中自定义比较,如下所示。
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 :(得分:2)
std::map
中的自定义比较器必须与“less”运算符具有相同的行为。因此,您必须将代码更改为return (a.length() < b.length());
答案 1 :(得分:2)
除了Chad的评论,我认为您的问题是您在实施中包含=
。
map
对平等的定义是!less(a,b) && !less(b,a)
。这不适用于您对less
。
以下是标准在“23.2.4关联容器”中所说的内容
3短语“等价键”是指等价关系 由比较强加而不是操作员==在键上。那就是两个 如果用于比较,则密钥k1和k2被认为是等效的 object comp,comp(k1,k2)== false&amp;&amp; comp(k2,k1)== false。任何 两个密钥k1和k2在同一个容器中,调用comp(k1,k2) 总是返回相同的值。
答案 2 :(得分:1)
地图的比较器必须强加严格弱排序。在某种程度上,这意味着comp(a,b)
和comp(b,a)
不能同时为真。因此,比较应该更像<
和>
,而不是<=
或>=
。