Frage zu priority_queue mit eigener compare-Funktion



  • Hallo zusammen!

    Ich möchte eine priority_queue mit zugrundeliegendem vector<int> benutzen, dazu aber nicht den Standard-Vergleichsoperator operator< von int, sondern meinen eigenen, also in

    priority_queue< int, vector<int>, greater<int> > pq;

    statt greater<int> meine eigene Vergleichsfunktion. Und das ganze wenn möglich ohne struct.

    Geht das?

    Danke für Lösungen!

    Ciao, Fin



  • Was erwartest du?

    Grundsätzlich sähe ein entsprechendes Vergleichsstruct ungefähr so aus:

    struct Compare
    {
        bool operator () (int i, int j)
        {
            return ((i * 1337) % 42) < ((j * 1337) % 42);
        }
    };
    

    Dann benutzt du statt greater<int> Compare, sonst gibts nichts. Oder hab ich deine Frage überlesen?

    /edit Oh, hab ich tatsächlich. Es sollte auch etwa so gehen:

    priority_queue<int, deque, bool (int, int)> p (&fun);
    


  • Kannst Du mal ein Beispiel bringen?

    Egal, wie ich es mache, es gibt immer eine neue Fehlermeldung...

    z.B.

    bool test(int a, int b)
    {
      if (a > b)
        return true;
      else
        return false;
    }
    
    int main()
    {
      priority_queue<int, vector<int>, test() > pq;
    

    Gibt die Fehlermeldung:

    error: `bool test(int, int)' cannot appear in a constant-expression
    


  • schau dir doch mal das obige Beispiel an - richtig heißt es:

    priority_queue<int,vector<int>,bool(int,int)> pq(test);
    //                             ^^Typ(Funktion)   ^Exemplar
    


  • So klappt's aber leider auch nicht:

    /usr/lib/gcc/x86_64-redhat-linux/3.4.4/../../../../include/c++/3.4.4/bits/stl_queue.h: In instantiation of `std::priority_queue<int, std::vector<int, std::allocator<int> >, bool ()(int, int)>':
    priority.cpp:31: instantiated from here
    /usr/lib/gcc/x86_64-redhat-linux/3.4.4/../../../../include/c++/3.4.4/bits/stl_queue.h:359: error: field `std::priority_queue<int, std::vector<int, std::allocator<int> >, bool ()(int, int)>::comp' invalidly declared function type
    gmake: *** [priority.o] Error 1
    

    Mit der

    struct
    

    Lösung hat's funktioniert, vielleicht geht's ja auch nicht anders.

    Danke für die Hilfe soweit 🙂



  • Es scheint nur mit Pointern zu funktionieren:

    std::priority_queue<int, std::vector<int>, bool (*) (int, int)> p (&test);
    

    kompiliert.


Anmelden zum Antworten