为什么C ++ std :: min_element库函数接受使用bool返回类型的函数对象而不是像C中的int的函子?

时间:2019-05-30 09:18:21

标签: c++ stl

C ++标准库函数std::min_element()接受一个函数对象作为最后一个参数,并且该对象的返回类型为bool。为什么不是int

使用true或false时,我们只有两个选项:<>,但是如果两个条目相同,即==,该怎么办?

在C中,通过将返回类型选择为int来处理这种情况。但这对于C ++中的std::min_element()来说还没有完成。

这是什么原因?

2 个答案:

答案 0 :(得分:6)

您将从这些信息中获得什么?该函数应该返回最小的元素(因此名称为min_element)。它不需要关心平等,从中最终得到什么呢?布尔值足以判断一个元素是否小于另一个。处理平等性的方式取决于该可调用对象的实现。

cppreference的话:

bool cmp(const Type1 &a, const Type2 &b);
  

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

答案 1 :(得分:2)

我要指出的是,这与std的其他部分(例如sortmap)一致,它们都基于满足{{3} }。相同的问题可以扩展到所有这些方面。

  

原因是什么?

原始作者和标准委员会认为这是表达订购的一种更自然的方式。

通过int使用三种方式比较存在一些问题。

  • int具有三个以上的值。因此,您必须对返回值做进一步的算术运算。
  • 更容易陷入不确定的行为
struct three_way_compare
{
     int operator()(int lhs, int rhs) { return lhs - rhs; }
     // Undefined behaviour when rhs is a large positive value and lhs is a large negative value
}

您可以通过两次调用函子来合成三向比较。该参考文献使用

定义了要求
  

equiv(a, b),等效于!comp(a, b) && !comp(b, a)

的表达式

请注意,对于C ++ 20,使用Compare向该语言添加了三种方式的比较。我不确定是否可以更改现有算法以利用它。