如何将两组与自定义数据类型进行比较
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&, const std::set&)
没有提供我认为 OP 想要的灵活性,因为他也没有实现 Status::operator<
。
如果比较器是成员函数,那么在您的情况下它必须是 const
成员函数,因为它应用于常量对象(键)。然后就可以了:godbolt.org/z/0cYep3.
【参考方案1】:
按照 cmets 的建议,我不得不重载 == 运算符。
bool operator== (const Status& s) const
return x == s.x && y == s.y;
【讨论】:
以上是关于如何将两组与自定义数据类型进行比较的主要内容,如果未能解决你的问题,请参考以下文章