繁体   English   中英

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

[英]why C++ std::min_element library function accepts functor that takes function object of bool return type rather than int like in C?

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

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

在C中,可以通过将返回类型选择为int来处理这种情况。 但是对于C ++中的std::min_element() ,这并未完成。

这是什么原因呢?

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

cppreference的话来说:

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

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

我要指出的是,这与std其他部分(例如sortmap ,它们都基于满足Compare的函子对事物进行sort 相同的问题可以扩展到所有这些问题。

是什么原因?

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

通过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,使用operator <=>将三向比较添加到了语言中。 我不确定是否可以更改现有算法以利用它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM