Kurze Frage zu std::lower_bound
-
Hallo, in meinem Projekt habe ich eine Klasse definiert (ungefähr so):
class C { int member1; int member3; };Jetzt habe ich einen vector mit Elementen von C. Dieser Vector soll ständig nach member 1 sortiert sein, also habe ich ihn gekapselt. Wenn ein neues Element in den vector eingefügt wird, soll natürlich nicht der ganze vector umsortiert werden (daher lower_bound)
bool pred(const C& a, const C& b) { return a.get_member1() < b.get_member1(); } class Cs { std::vector<C> vec; public: void add(const C& c) { std::vector<C>::iterator it = std::lower_bond(vec.begin(), vec.end(), c.get_member1(), pred); vec.insert(it, c); } };Allerdings bekomme ich dieses Beispiel nicht ans laufen: Da, wo die ?? in der Parameterliste stehen, erwartet lower_bound ja einen Wert vom Typ "C" und nicht vom Typ "int" (für member1).
Wie löse ich dieses Problem? Muss ich hier ein Dummy Object vom Typ C erstellen, bei dem nur der "member1" wert gesetzt ist???
-
Du hast doch bereits ein Element vom Typ C verfügbar, das du als Vergleichswert an den Algorithmus übergeben kannst - was hindert dich daran, das zu verwenden:
std::vector<C>::iterator it = std::lower_bond(vec.begin(), vec.end(), c, pred);
-
Hm, das stimmt natürlich

Anscheinend hab ich noch ein bisschen Probleme, mich in das Konzept von C++ einzulesen.
Danke!
-
Falls Du so ein Objekt nicht hast, was auch öfter mal vorkommt, kannst du so ein Predicate verwenden:
struct Member1Less { bool operator(const C& lh, const C& rh) const; // wie bisher bool operator(const C& lh, int rh) const; bool operator(int lh, const C& rh) const; };Damit kannst du ein C auch mit einem int vergleichen.
Beistd::lower_bound<Iter, T, Pred>istTnämlich nicht unbedingt gleichIter::value_type. Es muss nur irgendetwas sein, womit ichPred::operator()aufrufen kann.
-
Ah, das wusste ich noch garnicht! Danke für den Tipp!
-
Guck dir mal std::priority_queue an, vielleicht hilft dir das ja weiter.