【问题标题】:std::map::erase(const key_type&) stop working after comparison customizedstd::map::erase(const key_type&) 在自定义比较后停止工作
【发布时间】:2013-06-26 18:47:16
【问题描述】:

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

【问题讨论】:

  • 我的地图键可以有相同的长度。这就是我所期望的。但即使我改成class my_cmp { public: bool operator()(const string &a, const string &b) { if (a.length() == b.length()) return (a < b); else return (a.length() > b.length()); } };

标签: c++


【解决方案1】:

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

【讨论】:

  • 是的。实际上 { if (a.length() == b.length()) return (a b.length()); } 工作。谢谢。
【解决方案2】:

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

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

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

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

【讨论】:

  • 顺便说一句,我在哪里可以找到地图的平等定义?
  • 编辑了答案以包含标准参考。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2013-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    相关资源
    最近更新 更多