簡體   English   中英

下面的比較器功能如何在c ++中工作?

[英]How does below comparator function works in c++?

bool comp(int a,int b){

    if ((a > 0 && b > 0) || (a < 0 && b < 0))
        return false;

    if ((a > 0) && (b < 0))
        return false;
}

對於給定的包含正整數和負整數的數組,上述函數可用於重新排列數組,以使負整數后跟正整數,並保留元素的順序。

例:

int arr [] = {1,2,-3,-1}, n=sizeof(arr)/sizeof(int);

sort(arr,arr+n, comp);

output : {-3,-1,1,2}

但是我無法理解它是如何工作的,有人可以解釋嗎?

您的斷言有兩個方面是錯誤的:

  1. 如果您了解我的意思,則不能保證std::sort保留不需要排序的元素的順序。

  2. 您的comp函數的行為是不確定的,因為它在所有控制路徑上都沒有明確的return值。

一種補救方法是使用std::stable_sort ,它將盡最大可能保留元素的順序。 比較器功能可以被調節,使得它的true如果第一個參數是負的,第二個是陽性(讓我們定義0為正):

bool comp(int a, int b){
    return a < 0 && b >= 0;
}

另一種解決方法是使用std::stable_partition

但是我無法理解它是如何工作的,有人可以解釋嗎?

我試圖解釋它應該如何工作,但實際上,它不起作用:)

bool comp(int a, int b) {

    if((a > 0 && b > 0) || (a < 0 && b < 0))
        return false;

    if((a > 0) && (b < 0))
        return false;

    return true;
}

此代碼試圖比較符號:檢查a符號是否比b符號“小”。 假設負數小於正數。 因此,-1的符號小於1的符號,-3的符號不小於-1的符號。

這里的問題是比較器應始終符合https://en.wikipedia.org/wiki/Weak_ordering#Strict_weak_orderings的要求

簡而言之,嚴格的弱排序是:對於任何ab ,只有一個條件成立: a < bb < ab == a 一個條件中有多個為真時,就不應存在。

當生產代碼中違反嚴格的弱訂購時,將發生非常糟糕的事情:加班,截止日期失敗,甚至更糟。

您的sort()在以下數組上將失敗: { 1, 0, 2, 0, -3, 0,-1 }因為違反了嚴格的弱排序: comp(-1, 0)為true並且comp(0, -1)是真的。

暫無
暫無

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

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