【问题标题】:Set equality with custom compare function使用自定义比较功能设置相等
【发布时间】:2017-06-07 06:59:51
【问题描述】:

我正在使用一组用户定义的类型和一个自定义比较函数。当我尝试在集合之间使用 == 运算符时,我得到一个编译时错误。我错过了什么?

#include <cassert>
#include <set>

// my user-defined type
struct IntWrapper {
    int value;
};

// my compare function
struct LessComparer {
    bool operator()(const IntWrapper& lhs, const IntWrapper& rhs) const {
        return lhs.value < rhs.value;
    }
};

int main() {
    std::set<IntWrapper, LessComparer> s;
    assert(s == s);  // I would expect this to work
}

Here you can see the error.

【问题讨论】:

  • 你的operator==(和operator!=)在哪里?
  • 自定义比较器用于比较集合中的元素,而不是用于比较集合
  • 这很有趣,但this 有效。不知道为什么,可能是编译器认为s是一个函数。
  • @ilotXXI 也许比较指针。
  • @Toris 但需要吗? std::set 只需要一个小于比较,从中很容易得到相等性检查;否则,根本无法构造该集合,因为它需要相等才能检查重复项。

标签: c++ stl set operators equality


【解决方案1】:

http://en.cppreference.com/w/cpp/container/set/operator_cmp

Key 必须满足 EqualityComparable 的要求才能使用重载 (1-2)。

http://en.cppreference.com/w/cpp/concept/EqualityComparable

类型 T 满足 EqualityComparable if
给定 a、b 和 c,类型为 T 或 const T 的表达式
以下表达式必须有效并具有指定的效果:
a == b

因此,您需要为IntWrapper 类型定义operator==

【讨论】:

  • 接受,但对我来说没有意义。为什么需要它?我已经定义了一个小于比较,很容易从中得到相等。
  • @effeffe 等价!= 平等。这些是不同的概念。如果要设置等价,可以使用not ((a &lt; b) || (b &lt; a))
  • 集合等价和集合相等有什么区别?
  • @effeffe 集合在它们的所有元素成对相等时是等效的,如果它们的所有元素成对相等则相等。如果没有一个对象在另一个对象之前排序,则两个对象是等价的,如果它们比较相等,则它们是相等的,例如如果点按距 (0; 0) 的距离排序,则 (0; 5) 和 (3; 4) 将等价,但肯定相等。因此,包含按该关系排序的元素的集合可以是等价的,也可以是不等的。
  • 我明白了,谢谢。不过,我希望 C++ 能够在 EqualityComparableLessThanComparable 之间强制具有两者的对象的一致性。不这样做听起来像是在找我麻烦。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-11
  • 1970-01-01
  • 2011-08-02
  • 1970-01-01
相关资源
最近更新 更多