您可以将函数指针、函数对象(或 boost lambda)传递给 std::sort 以定义要排序的容器元素的严格弱排序。
但是,有时(我已经打了好几次了),您希望能够链接“原始”比较。
一个简单的例子是,如果您正在对代表联系人数据的对象集合进行排序。有时你会想要排序
姓氏,名字,区号. 其他时间
名字,姓氏- 还有其他时候
年龄、名字、区号... ETC
现在,您当然可以为每种情况编写一个额外的函数对象,但这违反了 DRY 原则——尤其是在每次比较不那么微不足道的情况下。
似乎您应该能够编写比较函数的层次结构 - 低级函数进行单一的、原始的比较(例如名字<名字),然后更高级别的函数连续调用低级函数(可能与&& 利用短路评估)来生成复合函数。
这种方法的问题在于 std::sort 采用二元谓词——谓词只能返回一个布尔值。因此,如果您正在编写它们,则无法判断“false”是否表示相等或大于。您可以使较低级别的谓词返回一个具有三种状态的 int - 但是您必须将它们包装在较高级别的谓词中,然后才能单独与 std::sort 一起使用。
总而言之,这些都不是无法克服的问题。它似乎比它应该的更难 - 并且肯定会邀请帮助库实现。
因此,有没有人知道任何可以在这里提供帮助的预先存在的库(特别是如果它是 std 或 boost 库) - 对此事有任何其他想法吗?
[更新]
正如一些评论中提到的 - 我已经开始编写自己的类实现来管理它。它相当小,一般来说可能有一些问题。但在此基础上,对于任何感兴趣的人,课程都在这里:
还有一些辅助函数(为了避免需要指定模板参数)在这里: