【问题标题】:Confusion regarding comparison operators in std::min, std::max关于 std::min、std::max 中的比较运算符的困惑
【发布时间】:2020-02-14 21:50:26
【问题描述】:

std::minstd::max 允许自定义比较器,但我对排序的工作原理有点困惑。

考虑以下几点:

   int i = 1;
   int j = 2;

   auto min_val = min(i, j, [](const auto val1, const auto val2){
      if(val1 < val2) return true;
      return false;
   });

这将返回最小值,即i。但我不明白为什么我们使用&lt; 而不是&gt;,以及为什么val1val2 分别出现在操作数的左侧和右侧。

考虑以下几点:

   int i = 1;
   int j = 2;

   auto max_val = max(i, j, [](const auto val1, const auto val2){
      if(val1 > val2) return true;
      return false;
   });

我原以为这会返回最大值,但实际上返回的是最小值,而且我们必须再次使用&lt; 操作数。有人可以解释引擎盖下发生了什么吗?

我在其他一些问题上也遇到过这个问题,我认为是 std::priority_queuestd::map,其中排序和比较运算符对我来说不是很直观,大多数时候我必须猜测和检查得到我想要的。

【问题讨论】:

  • 如果您感到困惑或不记得,请查阅参考资料。 cppreference 对函子的期望非常清楚。见:en.cppreference.com/w/cpp/algorithm/max
  • @NathanOliver 我确实查看了 cpprefernce 的最小值和最大值,但其中一个有错字,因为两者的仿函数描述相同。
  • 这不是错字。应该是这样的。
  • 正如 Timo 所说,这不是拼写错误。两个函数除了第一个参数返回的 true 小于第二个参数。您可以使用类似的比较器编写 min 和 max 函数。
  • @Timo 哦,那我想这正是我在 OP 中使用 sn-ps 发现的。我认为我的困惑是函数如何处理函子的返回值,我认为网站上没有描述。

标签: c++ max min comparison-operators


【解决方案1】:

这基本上归结为标准中如何定义这些功能。例如,std::max 将比较器(您的 lambda)定义如下:

比较函数对象(即满足比较要求的对象)如果a小于b则返回真。

通常,当涉及到 c++ 标准库中值的顺序时,它(几乎?)总是 std::less 用作默认比较器,它完全符合 left &lt; right

至于为什么总是a &lt; b 必须满足,我认为如果您自己编写它只是为了减少编码开销。想象一下有一个这样的比较器:

struct MyComp
{
    bool operator()(MyType a, MyType b) const
    {
        return a.getValue() < b.getValue();
    }
};

由于标准库中的所有结构都要求您的比较器返回 true,如果 a &lt; b,您可以使用一个简单的比较器来处理多种结构。例如

auto maxVal = std::max(a, b, MyComp{});
auto minVal = std::min(a, b, MyComp{});
std::map<MyType, MyComp> myMap;

都只适用于一个比较器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-02
    相关资源
    最近更新 更多