0

我在 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) 在自定义比较后仍然有效?

4

3 回答 3

2

自定义比较器std::map必须具有与“更少”运算符相同的行为。因此,您必须将代码更改为类似return (a.length() < b.length());

于 2013-06-26T18:55:07.267 回答
2

除了@Chad 的评论,我认为您的问题是您包含=在您的实施中。

map的平等定义是!less(a,b) && !less(b,a)。这不适用于您的定义less

这是标准在“23.2.4 关联容器”中所说的

3 短语“键的等价”是指比较强加的等价关系,而不是键上的运算符==。也就是说,如果对于比较对象 comp,comp(k1, k2) == false && comp(k2, k1) == false,则认为两个键 k1 和 k2 是等效的。对于同一容器中的任意两个键 k1 和 k2,调用 comp(k1, k2) 应始终返回相同的值。

于 2013-06-26T18:55:49.307 回答
1

地图的比较器必须强制执行严格的弱排序。这在一定程度上意味着comp(a,b)并且comp(b,a)不能同时为真。所以比较应该更像<and>而不是像<=or >=

于 2013-06-26T19:57:45.027 回答