Mit lower_bound, upper_bound und binary_search zu finden, das Objekt mit einer gleich member-Bereich

Habe ich ein struct, das so aussieht,

struct Foo {
    int a;
};

Ich habe einen Vektor, der diese Strukturen, die so Aussehen,

vector<Foo> foos;

Alle Foos sortiert werden, die integer a in aufsteigender Reihenfolge mit Hilfe der STL-sort () - Funktion. Jetzt möchte ich, um die Foo Objekt, die Mitglied Bereich a weniger als oder gleich einer gegebenen Zahl ist, wie die STL-lower_bound () - Funktion. Das problem ist, dass die STL-lower_bound-Funktion-Deklaration sieht wie folgt aus:

template <class ForwardIterator, class T, class Compare>
  ForwardIterator lower_bound ( ForwardIterator first, ForwardIterator last,
                                const T& value, Compare comp );

Während ich also etwas tun wollen wie,

lower_bound(foos.begin(), foos.end(), 5, custom_comp);

Kann ich nicht, wegen der int, ich bin auf der Suche nach (in diesem Fall 5) ist nicht der Typ Foo. Ich habe dieses Problem mit lower_bound(), upper_bound(), und binary_search(). custom_comp definiert nur die Reihenfolge und nicht definieren, dass ein Objekt mit a = 5 tatsächlich entspricht der int-5.

Gibt es eine elegante Möglichkeit dies zu tun, mit STL?

Edit:

Mir bewusst, dass mein Beispiel nicht vollständig darstellen mein problem. Das, was ich eigentlich habe, ist, dass Foo enthält zwei ints a und b. Wenn ich Anrufe, lower_bound, ich habe keinen Zugriff auf b (weil ich don ' T care about it). Jetzt das Problem mit billz Antwort ist, dass ich definieren einen Konstruktor, nur a als parameter, das ist nicht sehr elegant aus meiner Meinung nach (denn b ist nicht definiert oder frei wählbare, und dieser Konstruktor kann verwendet werden überall im code). Aber wenn dies die einzige Möglichkeit ist, werde ich es nehmen.

  • Es ist eine bessere Lösung in [stackoverflow.com/questions/5072257/..., und diese Frage ist eine mögliche doppelte dieser Frage. Zusammenfassung: In die lower_bound-Vorlage, Klasse T, die nicht den Datentyp der container-Inhalte reichten von den beiden iterator [first, last). Das heißt, T kann nur eine Ganzzahl verglichen werden. Sie können schreiben Sie einfach den Komparator zu bool Compare(Foo & f, int value) { return f.a < value; }. Und es funktioniert seit C++03.
InformationsquelleAutor gsingh2011 | 2012-11-13
Schreibe einen Kommentar