2009-05-15 3 views
13

Ich möchte das erste Element in einem sortierten Vektor finden, der ein Feld weniger als einen Wert x hat.
Ich muss eine Vergleichsfunktion liefern, die 'x' mit dem internen Wert in MyClass vergleicht, aber ich kann die Funktionsdeklaration nicht berechnen.
Kann ich nicht einfach '<' überlasten, aber wie mache ich das, wenn die Argumente '& MyClass' und 'float' sind?Funktion für obere_unten/untere_Bindung vergleichen

float x; 
std::vector<MyClass>::iterator last = std::upper_bound(myClass.begin(),myClass.end(),x); 

Antwort

15

Welche Funktion haben Sie an den Sortieralgorithmus übergeben? Sie sollten in der Lage sein, das gleiche für oberes_und unteres_Band zu verwenden.

Der einfachste Weg, um den Vergleich durchzuführen, besteht darin, ein Dummy-Objekt zu erstellen, dessen Schlüsselfeld auf Ihren Suchwert eingestellt ist. Dann wird der Vergleich immer zwischen ähnlichen Objekten stattfinden.

Edit: aus irgendeinem Grunde Wenn Sie nicht ein Dummy-Objekt mit dem richtigen Vergleichswert erhalten können, dann können Sie einen Vergleich Funktor erstellen. Der Funktor kann drei Überlastungen für operator() zur Verfügung stellen:

struct MyClassLessThan 
{ 
    bool operator() (const MyClass & left, const MyClass & right) 
    { 
     return left.key < right.key; 
    } 
    bool operator() (const MyClass & left, float right) 
    { 
     return left.key < right; 
    } 
    bool operator() (float left, const MyClass & right) 
    { 
     return left < right.key; 
    } 
}; 

Wie Sie sehen können, das ist der lange Weg, um darüber zu gehen.

+0

Das war das Problem, die Sortierfunktion nimmt zwei Const Refs zu MyClass-Objekten. Die Suchfunktion muss eine MyClass und einen Float enthalten. Gleiches Problem für die Verwendung von bind2nd() –

+0

Operator(), um Dinge zu vergleichen - jetzt, warum habe ich nicht daran gedacht !!! Je mehr ich STL verwende, desto mehr liebe ich Python. danke –

+0

sollte es nicht const sein MyClass & links, const MyClass & richtig? – chmike

0

Ich denke, was Sie brauchen, ist std::bind2nd(std::less<MyClass>(), x). Aber natürlich muss der Operator < für MyClass definiert werden.

Edit: oh, und ich denke, dass Sie einen Konstruktor für MyClass benötigen, die nur ein Float akzeptiert, so dass es implizit konvertiert werden kann. Es könnte jedoch einen besseren Weg geben, dies zu tun.

6

Sie können weitere Mark-Lösung verbessern, indem eine statische Instanz MyClassLessThan in MyClass Schaffung

class CMyClass 
{ 
    static struct _CompareFloatField 
    { 
     bool operator() (const MyClass & left, float right) //... 
     // ... 
    } CompareFloatField; 
}; 

Auf diese Weise können lower_bound auf folgende Weise aufrufen:

std::lower_bound(coll.begin(), coll.end(), target, CMyClass::CompareFloatField); 

Dies macht es ein bisschen mehr lesbar

+1

Ich würde immer noch ein Dummy-Objekt und einen Operator() für jedes Mitglied benötigen - aber Ihre ist klarer beim Lesen der Absicht - danke –

Verwandte Themen