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.
    Bei std::lower_bound<Iter, T, Pred> ist T nämlich nicht unbedingt gleich Iter::value_type . Es muss nur irgendetwas sein, womit ich Pred::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.


Anmelden zum Antworten