2017-01-07 4 views
0

Ich habe eine Klasse Funktor (zu komplex, um als Lambda zu implementieren), aber um die Idee zu streichen, möchte ich sicherstellen, dass der Funktor das Compare Prädikat erfüllt. Das Problem ist, ich möchte, dass alle Werte größer als (1) aufsteigende Reihenfolge ergeben, aber alle Werte von (1) am "Ende" platzieren - z. B. als "größere" Werte behandelt werden.C++ mit 'Tweaked' vergleichen Funktor vergleichen

z.B. {2, 2, 2, 3, 3, 3, 4, 5, 6, 6, ..., 1, 1, 1}

das Funktionsobjekt als struct wird Argument von einem (kompliziert) Objekt zu extrahieren Referenz mit, aber der wichtigste Teil ist, in dem Funktionsobjekt das Verfahren konstruiert implementiert ist. Zur Vereinfachung:

bool operator() (unsigned i, unsigned j) 
{ 
    if (i == 1) return false; // (1 >= x) 
    if (j == 1) return true; // (x <= 1) 

    return (i < j); 
} 

Dies scheint mit std::sort und std::stable_sort wie erwartet zu funktionieren. Aber, ich bin immer noch nicht überzeugt, dass es die Kriterien für Compare, in Bezug auf strenge schwache Ordnung korrekt erfüllt. Beachten Sie, dass x <= 1 in allen Fällen - also für: i, j >= 1. Klar, (1, 1) => false

Ist meine "Tweaked" Funktor korrekt, auch wenn es am Ende Werte von (1) platziert? Das ist (1) wurde behandelt, um als größer als Werte x > 1 interpretiert werden? Oder habe ich gerade Glück mit meinen sort Implementierungen?


Wie ich geklärt haben sollte, wird der Wert (0) nicht auftritt. Ich hatte dies ursprünglich in einem Kommentar für die (sehr schlaue) angenommene Antwort aber versehentlich gelöscht.

+0

Sieht OK wie geschrieben. Lies einfach "1" als "Unendlichkeit", um dich selbst zu überzeugen. –

+0

@IgorTandetnik - das ist ein sehr nützlicher Ratschlag, da ich die Fälle "i = 1" und "j = 1" vor dem Vergleich explizit eliminiere. Es sind eher die formalen Definitionen des 'Compare'-Prädikats, zu denen ich mich nicht hundertprozentig sicher bin. –

+0

Nun, [hier sind die Anforderungen] (http://en.cppreference.com/w/cpp/concept/Compare). Ich bin mir nicht sicher, wie ich dir helfen kann, dich davon zu überzeugen, dass dein Prädikat sie erfüllt. –

Antwort

1

Wenn Sie eine bijektive Operation definieren können, in der der Vergleich insgesamt/schwach ist, dann ist alles in Ordnung. Es stellt sich unser, dass für Ihre Art (unsigned) diese einfach -=2/+=2

bool operator()(unsigned i, unsigned j) const{ 
    return (i-2) < (j-2); // usigned will wrap around 0 
} 

Gut ist, das hängt auch davon, was man mit Null tun wollen.

Dies beruht in 1 - 2 == std::numeric_limits<unsigned>::max() so, wenn Sie z. 1 mit x erhalten Sie std::numeric_limits<unsigned>::max() < x - 2 das ist false, auch wenn x ist auch 1 (es wird für 0 gelten, wenn es solche gibt).

+1

Dies ist inspiriert - und ich glaube, dass die Bedingung immer noch als "falsch" bewertet wird, auch wenn "x = 1", wie gewünscht. –

+0

Hinweis: Dies wird "0" vor "1" setzen (ursprünglicher Post gab nicht an, wo "0" geht) –

+1

@ M.M. Ja, sagte das OP in einem Kommentar, dass "es keine Null gibt". Später löschte er den Kommentar. Deshalb habe ich geschrieben "das hängt auch davon ab, was Sie mit Null machen wollen." – alfC