2011-10-14 45 views
30

我試圖使用lambda函數sort,但得到「分段錯誤」錯誤。我設法簡化代碼以執行以下操作:使用應該std ::排序工作與C++ 0x/C++ 11中的lambda函數?

g++ -std=gnu++0x test2.cpp && ./a.out

#include <iostream> 
#include <algorithm> 

int main() 
{ 
    const int len = 18; 
    int intArr[len]; 
    for (int i=0;i<len;i++) intArr[i]=1000+i; 
    // The following is expected to sort all but the last element of the array 
    std::sort(intArr, intArr + len -1, [](int a, int b) 
    { 
     std::cout<<"("<<a<<", "<<b<<")\n"; 
     return (a<b?-1:(a>b?1:0)); 
    }); 
    return 0; 
} 

予編譯和運行在Ubuntu 11.04(64)該代碼。

它會打印大量的表單(large_integer,1008),幾個(0,1008)對,並以「分段錯誤」退出。

+4

就像一句話,你只是用你的代碼排序前17個元素。 –

+5

是的。這個事實在代碼的唯一評論中被注意到。 – fiktor

+0

@KerrekSB:「//下面預計排序除了陣列的最後一個元素」 – Griwes

回答

33

比較謂詞應返回bool:如果爲< b,則返回true,否則返回false。將退貨聲明更改爲:

return a < b; 

不要將它與C型3路比較函數混淆。

+0

謝謝。的確我錯了。用 fiktor

+1

爲什麼它與錯誤謂詞段錯誤仍然是一個謎。 –

+1

@NilsPipenbrinck:如果比較器沒有施加嚴格的弱排序,則'std :: sort'具有未定義的行爲。出現段錯誤並不意外。 – Mankarse

16

謂詞應該實現一個簡單的弱排序。 如果您想對整個事物進行排序,那麼您的範圍已關閉。(我錯過了,這是故意的)。所以,所有的一切,我們正在尋找這樣的事情:

std::sort(intArr, intArr + nelems, [](int a, int b){ return a < b; }); 

甚至:

std::sort(intArr, intArr + nelems); 

排序默認的謂詞是std::less<T>,這不正是lambda所做的。

6

std::sort的謂詞不採用類似Java的-1,0,1,而是希望您返回一個布爾值,以回答「第一個參數小於第二個參數嗎?」的問題,該參數用於弱排序元素。由於-1是非零值,因此排序算法將其視爲是真實的,並且會導致算法出現故障。

+1

「//下面預計排除陣列中最後一個元素」 – Griwes

+0

@Griwes Huh?這與答案有什麼關係? –

+0

@Christian:我之前的編輯錯過了他的代碼中的評論。我從我的答案中刪除了它。 Griwes顯然在我做之前就抓住了它。 –