2011-10-14 12 views
30

Próbowałem użyć funkcji lambda z sort, ale wystąpiły błędy "Błąd segmentacji". Udało mi się uprościć kod do następujących:Czy std :: sort działa z funkcją lambda w C++ 0x/C++ 11?

#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; 
} 

skompilować i uruchomić ten kod w Ubuntu 11.04 (x64) za pomocą

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

Drukuje wiele par formularza (large_integer, 1008), kilka (0, 1008) i wyjść z "Błąd segmentacji".

+4

Pamiętaj, że sortujesz tylko 17 pierwszych elementów za pomocą kodu. –

+5

Tak. Ten fakt został odnotowany w jedynym komentarzu do kodu. – fiktor

+0

@KerrekSB: "// Następujące elementy mają sortować wszystkie oprócz ostatniego elementu tablicy" – Griwes

Odpowiedz

33

Predykat porównania powinien zwracać wartość bool: true, jeśli < b i false w przeciwnym razie. Zmień instrukcję zwrotu na:

return a < b; 

Nie należy mylić tego z funkcjami porównawczymi w stylu C w stylu C.

+0

Dziękuję. Rzeczywiście się pomyliłem. Z fiktor

+1

Powód, dla którego łamie się z błędnym predykatem, wciąż jest dla mnie zagadką. –

+1

@NilsPipenbrinck: 'std :: sort' ma niezdefiniowane zachowanie, jeśli komparator nie narzuca ścisłego słabego porządkowania. To nie jest tak nieoczekiwane, że mogło dojść do skutku. – Mankarse

16

Predykat ma za zadanie wdrożyć proste, słabe uporządkowanie. Również twój zasięg jest wyłączony, jeśli chcesz posortować całą rzecz. (brakowało mi, że to było zamierzone.) Więc w sumie szukamy coś takiego:

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

lub nawet:

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

Domyślna orzecznik do sortowania jest std::less<T>, co robi dokładnie to, co robi lambda.

6

Predykat dla std::sort nie przyjmuje kodu Java podobnego do -1,0,1, ale zamiast tego chce, abyś zwrócił wartość logiczną, która odpowiada na pytanie "Czy pierwszy argument jest mniejszy od drugiego argumentu?", Który jest używany do słabej kolejności elementy. Ponieważ -1 ma wartość niezerową, jest uważane za prawdziwe przez algorytm sortowania i powoduje awarię algorytmu.

+1

"// Następujące elementy mają sortować wszystkie oprócz ostatniego elementu tablicy" – Griwes

+0

@Griwes Huh? Jak to ma związek z odpowiedzią? –

+0

@Christian: Miałem wcześniejszą edycję, która pominęła komentarz w jego kodzie. Usunąłem to z mojej odpowiedzi. Griwes najwyraźniej go złapał, zanim to zrobiłem. –

Powiązane problemy