2015-08-28 4 views
9

Ich versuche, einige ganze Zahlen zu sortieren und ungerade ganze Zahlen gefolgt von geraden vorzunehmen. Ich bin mit Visual Studio 2015Fehler: "Ungültiger Vergleicher" beim Sortieren mit benutzerdefinierter Vergleichsfunktion

Hier ist mein Code:

int w[]={1,2,3,4,5,6}; 
sort(w,w+6,[](const int&i,const int&j)->bool { 
return (i&1)==(j&1)//When both are odd or even, the order is OK 
||i&1;//if one is odd and one is even,check if the first one is odd 
}); 

Wenn er ausgeführt wird, ein Fehler auftritt, sagt "Expression: ungültige Komparator". Ich weiß nicht, warum es diesen Fehler verursachen würde. Wie man es ändert?

Antwort

11

sort erfordert eine strict weak ordering. Dein Komparator ist keiner. Unter vielen anderen Dingen muss für eine strenge schwache Bestellung comp(x, x)false sein.

sort ist der falsche Algorithmus dafür sowieso (ja, Sie können es verzerren, um zu tun, was Sie wollen; nein, Sie sollten es nicht tun). Was Sie tun möchten, ist eine Partition. Dafür haben wir std::partition:

std::partition(std::begin(w), std::end(w), [](int x) { return x % 2 != 0; }); 

Oder std::stable_partition, wenn Sie die Partition wollen (erhalten die relative Reihenfolge der Elemente) stabil.

+0

... es ist * möglich, 'sort' für Partitionierung zu missbrauchen, aber das ist die beste Antwort. – Potatoswatter

Verwandte Themen