[英]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
其他部分(例如sort
和map
,它们都基于满足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.