C ++标准库函数std::min_element()
接受一个函数对象作为最后一个参数,并且该对象的返回类型为bool
。为什么不是int
?
使用true或false时,我们只有两个选项:<
或>
,但是如果两个条目相同,即==
,该怎么办?
在C中,通过将返回类型选择为int
来处理这种情况。但这对于C ++中的std::min_element()
来说还没有完成。
这是什么原因?
答案 0 :(得分:6)
您将从这些信息中获得什么?该函数应该返回最小的元素(因此名称为min_element
)。它不需要关心平等,从中最终得到什么呢?布尔值足以判断一个元素是否小于另一个。处理平等性的方式取决于该可调用对象的实现。
用cppreference的话:
bool cmp(const Type1 &a, const Type2 &b);
比较函数对象(即满足比较要求的对象),如果a小于b,则返回``true''。
答案 1 :(得分:2)
我要指出的是,这与std
的其他部分(例如sort
和map
)一致,它们都基于满足{{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向该语言添加了三种方式的比较。我不确定是否可以更改现有算法以利用它。