簡體   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