【发布时间】:2023-03-22 04:09:02
【问题描述】:
您可以将函数指针、函数对象(或 boost lambda)传递给 std::sort 以定义要排序的容器元素的严格弱排序。
但是,有时(我已经多次提到这一点),您希望能够链接“原始”比较。
一个简单的例子是,如果您对代表联系人数据的对象集合进行排序。有时你会想要排序
姓、名、区号。其他时候
first name, last name- 还有其他时候
age, first name, area code... 等等
现在,您当然可以为每种情况编写一个额外的函数对象,但这违反了 DRY 原则——尤其是在每次比较不那么琐碎的情况下。
您似乎应该能够编写比较函数的层次结构 - 低级函数执行单一的、原始的比较(例如名字
这种方法的问题在于 std::sort 采用二元谓词——谓词只能返回一个布尔值。因此,如果您正在编写它们,则无法判断“false”是否表示相等或大于。您可以让较低级别的谓词返回一个具有三种状态的 int - 但是您必须将它们包装在较高级别的谓词中,然后才能单独与 std::sort 一起使用。
总而言之,这些都不是无法克服的问题。这似乎比它应该做的更难 - 而且肯定会邀请帮助库实现。
因此,是否有人知道任何可以在这里提供帮助的预先存在的库(尤其是 std 或 boost 库) - 对此事有任何其他想法?
[更新]
正如在一些 cmets 中提到的 - 我已经着手编写自己的类实现来管理它。它相当小,一般来说可能有一些问题。但在此基础上,任何有兴趣的人都可以在这里上课:
还有一些辅助函数(避免需要指定模板参数)在这里:
【问题讨论】:
标签: c++ stl sorting compare predicate