如何将两组与自定义数据类型进行比较

Posted

技术标签:

【中文标题】如何将两组与自定义数据类型进行比较【英文标题】:How to compare two sets with custom datatypes 【发布时间】:2019-10-29 08:22:17 【问题描述】:

我需要检查两个具有自定义数据类型的集合是否相等。这是我的代码:

#include <set>

struct Status

    int x;
    bool y;

    Status() : x(0), y(false)
;

struct StatusComparator

    bool operator() (const Status& s1, const Status& s2)
    
        return (s2.x > s1.x);
    
;

int main(int argc, char **argv)

    std::set<Status, StatusComparator> s1, s2;
    auto x = s1 == s2;

    return 0;

我收到此错误:

error C2672: 'operator __surrogate_func': no matching overloaded function found

我尝试使用 std::set_symmetric_difference() 方法而不是相等运算符,这也给了我相同的结果。

更新: 我为 Status 重载了 == 运算符

bool operator == (const Status& s)

    return x == s.x && y == s.y;

我仍然遇到和以前一样的错误。

使用 std::equal 可以正常工作。

StatusComparator ob;
auto x = std::equal(s1.begin(), s1.end(), s2.begin(), s2.end(), ob);

【问题讨论】:

在 GCC 中我收到以下错误:error: no match for 'operator==' (operand types are 'const Status' and 'const Status') - set 尝试比较其每个元素,但它失败了,因为 Status 没有比较运算符 正如@rafix07 提到的,您必须为结构Status 实现运算符'==' 的重载 我认为,他应该使用std::equal,因为他使用了自定义比较器。 std::equal 可以采用二元谓词来断言相等,这可以根据 StatusComparator 定义。 operator==(const std::set&amp;, const std::set&amp;) 没有提供我认为 OP 想要的灵活性,因为他也没有实现 Status::operator&lt; 如果比较器是成员函数,那么在您的情况下它必须是 const 成员函数,因为它应用于常量对象(键)。然后就可以了:godbolt.org/z/0cYep3. 【参考方案1】:

按照 cmets 的建议,我不得不重载 == 运算符。

bool operator== (const Status& s) const

    return x == s.x && y == s.y;

【讨论】:

以上是关于如何将两组与自定义数据类型进行比较的主要内容,如果未能解决你的问题,请参考以下文章

init方法的重写与自定义

C++ 哈希表 - 如何解决 unordered_map 与自定义数据类型作为键的冲突?

pandas.factorize 与自定义数组数据类型

如何理解皮尔逊相关系数

内存对齐与自定义类型

将对象列表与自定义键进行比较