比较自定义后,std :: map :: erase(const key_type&)停止工作

时间:2013-06-26 18:47:17

标签: c++

我在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)在自定义比较后仍能正常工作?

3 个答案:

答案 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)不能同时为真。因此,比较应该更像<>,而不是<=>=