【发布时间】:2014-12-23 10:10:11
【问题描述】:
我有一个包含 2 个字段(例如 A 和 B)的记录。如果它们的 As 相等,则应将记录的 2 个实例视为相等。另一方面,记录实例的集合应按 B 字段排序。
是否有像 std::set 这样的容器,它可以用两个不同的谓词定义,一个用于排序,一个用于唯一性,所以我可以避免显式排序而只附加元素?如果不是,如何解决?
问候,
【问题讨论】:
-
为什么不使用
std::set并在record::B和operator==方面实现operator<record::A? -
@TheParamagneticCroissant 因为
std::set根本不使用==?这意味着它将允许 OP 的语义重复元素。 -
@Angew cppreference tells me: "
Key必须满足EqualityComparable的要求",那有错吗? -
乍一看,
std::set所需的订购条件是否能满足您施加的条件。它需要strict weak ordering,除其他外,它要求if !((a<b) || (b<a)) then a == b。std::set中的元素标识是这样定义的。如果你能设法将你的限制硬塞到该任务中,那就太好了,但看起来你不能立即做到。 -
@TheParamagneticCroissant 我不认为页面不正确。您提供的链接特别提到要使用
operator ==和operator !=两个std::set对象,Key必须是 EqualityComparable。这并不意味着它本身就是std::set的内在要求。
标签: c++ sorting boost stl stdset