[STL] Probleme mit der priority_queue



  • Hallo!

    Ich moechte innerhalb einer Methode gerne eine "priority_queue" mit Objekten einer anderen Klasse fuellen:

    // Datenklasse
    class MyData
    {
    public:
        MyData();
        operator< (const MyData& x) { return prio < x.prio; }
    
    private:
        int prio;
    };
    

    Nun muss ich ja aber in der Methode __Zeiger__ auf diese Objekte einfuegen, damit ich spaeter wieder darauf zugreifen kann:

    class Applikation
    {
        void fuelleQueue();
        // ...
    };
    
    Applikation::fuelleQueue()
    {
        priority_queue< MyData* > pq;
    
        // Daten ermitteln und Objekt erstellen...
        MyData* temp = new MyData();
    
        // In Queue einfuegen
        pq.push(temp);
    }
    

    Das funktioniert auch alles soweit ganz gut, ich kann dann in einer anderen Methode der Klasse "Applikation" ueber die Zeiger wieder an die Objekte kommen.

    Nun zum eigentlichen Problem: Wenn ich vorgehe wie oben beschrieben, wird der "operator<" nicht verwendet!

    Wenn ich meine Queue hingegen in dieser Art befuelle, werden die Datensaetze korrekt sortiert ("operator<" wird aufgerufen):

    Applikation::fuelleQueue()
    {
        priority_queue< MyData > pq;
    
        // Daten ermitteln und Objekt erstellen...
        MyData temp();
    
        // In Queue einfuegen
        pq.push(temp);
    

    Allerdings sind die lokalen Objekte dann nach dem Ende der Methode verloren!
    Irgendwie muss ich sicherlich den "operator<" abaendern ... aber leider fehlt mir hier das fundierte Wissen ueber Zeigen/Referenzen etc. in C++ ... 😢

    Danke fuer eure Hilfe!



  • du musst die funktion zum sortieren mit angeben.
    schau dir mal das an
    http://www.cpp-tutor.de/cpp/le13/le13_04.htm#pqueue



  • miller_m schrieb:

    du musst die funktion zum sortieren mit angeben.
    schau dir mal das an
    http://www.cpp-tutor.de/cpp/le13/le13_04.htm#pqueue

    Danke!

    Habe mir jetzt mal ein entsprechenden Funktionsobjekt definiert:

    struct VergleicheMyData
    {
        bool operator() (MyData* x,
                         MyData* y) const
        {
            return (x->getPrio() > y->getPrio());
        }
    };
    
    [...]
    
    // Nun die Queue:
    VergleicheMyData cmpFunc;
    priority_queue< MyData*, 
                    vector< MyData* >, 
                    VergleicheMyData > pq(cmpFunc);
    

    Funktioniert nun auch wie gewuenscht. Allerdings frage ich mich nun, ob das aus "stil-" sowie performance-technischen Gruenden so okay ist?

    Vielen Dank!



  • Ja, das ist stilistisch okay und Performance-Technisch super, weil die Vergleichs-Funktion zur Compilezeit bekannt ist und damit sogar geinlined werden kann.



  • Kann man eigentlich in einer priority_queue das TOP Element irgendwie aktualisieren? Bisher muß man es sich rauskopieren, etwas ändern und neu einfügen. Wäre es nicht irgendiwe möglich der Queue zu sagen, daß sich dieses Element geändert hat und neu sortiert werden soll?


Log in to reply