Implementing Compare for std::set
Implementing Compare for std::set
我有一个结构,它只是我想存储在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);
相关文章:
- 在声明中合并两个常量"std::set"(不是在运行时)
- 有没有办法对std::unordered_set、std::unrdered_map、std::set、std::map
- 将 std::set 与基于键的比较器一起使用
- 修改"std::set"中用户定义类型的值
- 如何在构造函数参数中初始化"std::set"?
- 如何使用 lower_bound/upper_bound 从 std::set 获取索引号?
- 如何在 C++ 中转发声明 std::set?
- 重构使用动态强制转换的 std::set 的比较运算符
- 为什么 std::set.erase(first, last) 会影响从中获取 (first, last) 的容器?
- 将 std:set<int32_t> 复制到 std::set <uint32_t>的好方法
- 错误 C2676:std::set::const_iterator 没有运算符 + 函数?
- std::set 是否将对象连续存储在内存中?
- google test PrintTo for std::set<std::string>
- 不能对 std::set<std::string, std::less 使用用户提供的比较函数<>>
- "Flattening" std::set<std::string> 用于存储和比较?
- C++ std::map<std::string, std::set<std::string>> .如何循环设置值?
- 在std::set/std::map中存储具有多个不同类型字段的c++对象的有效方法
- 在C++中迭代 std::set<std::string> 时出现分段错误
- 从声明为 std::set<std::shared_ptr> edges_ 的edges_中删除边<Edge>;
- 将基于范围的 for 与 std::set<std::unique_ptr <T>一起使用>已删除函数