簡體   English   中英

在C ++中的STL的比較函數中使用“ <=”符號而不是“ <”符號有什么區別?

[英]What is the difference between using a “<=” sign instead of a “<” sign in the compare function of an STL in C++?

我必須在sort()函數中實現第三個參數cmp, 以便按降序 對整數數組進行排序。

問題在於此定義無法正常運行,

bool cmp (int a, int b)
{
    if(a<b)
        return false;
    else
        return true;
}

但是,這確實

bool cmp (int a, int b)
{
    if(a<=b)
        return false;
    else
        return true;
}

在main()函數中,我使用

sort(Arr,Arr+n,cmp);

請注意,我聲稱第一個代碼無法正常工作,因為當我使用第二個代碼時,我接受了我在Codechef上解決問題的解決方案,但我沒有使用第一個代碼。

如果兩個值相等,則STL比較函數必須返回false。

排序上

最后一個參數:

comp-比較函數對象(即滿足Compare要求的對象)...。

相比

comp(a,b)

建立具有以下屬性的嚴格弱排序關系:

對於所有a,comp(a,a)== false

....

這就是為什么

if(a<=b) 
    return false;

工作,而

if(a<b)
    return false;

沒有。

std::sort的compare函數返回一個值,該值指示是否按照其定義的特定嚴格弱順序將作為第一個參數傳遞的元素視為在第二個參數之前。

這是來自sgi的嚴格弱排序的定義

嚴格弱排序是比較兩個對象的二進制謂詞,如果第一個對象在第二個對象之前,則返回true。 該謂詞必須滿足嚴格的弱序的標准數學定義。 確切的要求在下面說明,但是它們的大致含義是,嚴格的弱排序必須以“小於”的方式運行:

  • 如果a小於b,則b不小於a,
  • 如果a小於b且b小於c則a小於c,依此類推。

根據比較功能的文檔

建立嚴格的弱排序關系

因此,函數comp必須定義嚴格的弱排序。 根據定義,它必須滿足三個條件:

1) comp(x, x)對於所有x (反身性條件)為假

2)如果comp(x, y)!comp(x, y) (不對稱條件)

3)如果comp(x, y)comp(y, z)然后comp(x, z) (傳遞性條件)

不難看出, cmp函數的第一個示例不滿足非反射性條件,因此不能用作std::sort comp參數。 同樣清楚的是,在x, y為數字的情況下,第二個cmp示例滿足所有三個條件,因此可以將其作為comp參數傳遞給std :: sort。

如果std::sort提供的compare函數的第一個參數位於第二個參數之前,則必須返回true,否則返回false。

因此,對於降序 ,應使用>運算符>,對於int s,它返回<=運算符返回(用於實現比較)的補碼。 最好使用std::greater<int>避免此類陷阱。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM