Implementing Compare for std::set

Implementing Compare for std::set

本文关键字:set std for Compare Implementing      更新时间:2024-09-23

我有一个结构,它只是我想存储在std::set中的两个int,同时还利用了它的排序属性。例如

struct Item
{
int order;
int value;
};

所以我写了一个比较

struct ItemCmp
{
bool operator()( const Item& lhs, const Item& rhs ) const
{
return lhs.order < rhs.order || lhs.value < rhs.value;
}
};

其目的是Item在集合中应首先按ORDER排序,然后按VALUE排序。如果我把这些Item放在vector中并使用std::sort,似乎可以按预期工作。

我还为中的案例实现了单元测试https://en.cppreference.com/w/cpp/named_req/Compare

然而,现在这个测试用例失败了:

std::set<Item, ItemCmp> stuff;
stuff.insert( {1, 1} );
stuff.insert( {1, 1} );
CHECK( stuff.size() == 1 );

set的大小为2,违反了set的合同。我哪里错了?

根据@retired ninja的评论,答案是确保比较器进行正确的字典比较。其中一个快捷方式是利用std::tuple的运算符(请参阅https://en.cppreference.com/w/cpp/utility/tuple/operator_cmp(使用此示例:

return std::tie(lhs.order, lhs.value) < std::tie(rhs.order, rhs.value);