【问题标题】:std::sort descending order with operator overloading带有运算符重载的 std::sort 降序
【发布时间】:2016-11-17 20:04:47
【问题描述】:

我有一个 std::vector 的对象,为此我重载了 < 运算符。

如何使用std::sort 对其进行降序排序(无需编写自己的比较器)?

【问题讨论】:

  • std::sort(begin(v), end(v), std::greater<>);
  • std::sort(v.rbegin(), v.rend());
  • 从 C++14 开始,比较函数有一个特殊化,可以通过将 void 作为模板参数传递来实现。同时,标准将void设为默认模板参数,如果没有指定。语法std::greater<> 使用默认参数实例化对象
  • @GuyGreer 但该对象仍需要实例化,即std::greater<>()

标签: c++ sorting c++11 std


【解决方案1】:

您可以在std::bind 的帮助下简单地将参数转换为std::less

using namespace std::placeholders;
std::sort(v.begin(), v.end(), std::bind(std::less<T>{}, _2, _1));

但我认为简单地编写等效的短 lambda 会更简洁,即使它违反了不编写自己的 Comparator 的约束:

std::sort(v.begin(), v.end(), [](T const& lhs, T const& rhs) { return rhs < lhs; });

【讨论】:

  • 甚至std::greater&lt;T&gt;
  • 虽然std::greaternot2(std::less) 不同,但我很确定它们在排序时会给出相同的结果...
  • @GuyGreer std::greater 使用 operator&gt;,而不是 operator&lt;。使用该答案的答案已发布并已被删除。至于用not_fn取反,那不是给你!(a &lt; b),这在逻辑上是(当所有关系运算符都被合理重载时)a &gt;= b,当你需要a &gt; b时?
  • @Barry Heh,好电话,我认为确实存在,虽然不是那个名字:std::bind(std::less&lt;T&gt;(), std::placeholders::_2, std::placeholders::_1)。 lambda 违背了 OP 的不创建自定义比较器的规定要求。 std::bind 没有。然而,看到这个烂摊子,我希望 OP 改变主意,无论如何都要选择 lambda。 :)
  • 这看起来像 UB:如果你对 [1, 1] 进行排序,那么两个比较都会产生 true
【解决方案2】:
std::sort(v.rbegin(), v.rend());

【讨论】:

    【解决方案3】:

    您可以使用std::sort 对数组进行排序,然后使用std::reverse 将其反转。这将按照您想要的方式进行排序。

    std::sort(v.begin(), v.end());
    std::reverse(v.begin(), v.end());
    

    【讨论】:

      猜你喜欢
      • 2019-10-03
      • 2017-01-04
      • 2013-07-11
      • 2021-10-25
      • 1970-01-01
      • 2018-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多