← 模式

字典序

12345678910111213141516171819#include <tuple> class foo { public: foo(int n_, char c_, double d_) : n{n_}, c{c_}, d{d_} {} friend bool operator<(const foo& lh, const foo& rh) { return std::tie(lh.n, lh.c, lh.d) < std::tie(rh.n, rh.c, rh.d); } private: int n; char c; double d; };

此模式采用 CC0 公共领域贡献 许可。

需要 c++11 或更新版本。

意图

在类的成员之间实现字典序比较。

描述

第 3-19 行foo 类中,有三个成员变量 ncd,它们在第 16-18 行声明。我们希望为 foo 实现一个排序关系,其中这些成员按字典序进行比较。

正确实现 3 个或更多元素的排序关系是繁琐且容易出错的。幸运的是,标准库为 std::tuple 提供了字典序比较,我们可以利用它。

第 10-14 行定义的 foo 的小于运算符,会首先比较成员 n,如果 n 相等,则比较 c,如果 nc 都相等,最后比较成员 d。为了实现这一点,我们在第 12 行第 13 行使用 std::tie,分别创建包含左操作数和右操作数成员引用的 std::tuple。对这些 std::tuple 进行比较,就实现了对其成员的字典序比较。

贡献者

  • Joseph Mansfield
  • Bjorn Fahller

最后更新

2017年12月9日

来源

在 GitHub 上 Fork 此模式

分享