std::set mit eigenem vergleichsoperator



  • hola

    wie mach ich das ?
    hab folgendes:

    class Dataset;
    
    bool DatasetLess(const Dataset *d1, const Dataset *d2)
    {
       return *d1 < *d2;
    }
    
    std::set<Dataset*, DatasetLess> liste; /* Zeile 28 */
    

    bekomme nen fehler:

    [BCC32 Fehler] BaseTable.h(28): E2401 Ungültige Template-Argumentliste
    

    wie mach ich das richtig ?

    Meep Meep



  • Entweder:

    class Dataset;
    
    struct DatasetLess
    {
        bool operator () (const Dataset *d1, const Dataset *d2) const
        {
            return *d1 < *d2;
        }
    };
    
    std::set<Dataset*, DatasetLess> liste;
    

    oder:

    class Dataset;
    
    bool DatasetLess(const Dataset *d1, const Dataset *d2)
    {
       return *d1 < *d2;
    }
    
    std::set<Dataset*, bool (const Dataset*, const Dataset*)> liste (&DatasetLess);
    

    Ersteres ist wahrscheinlich kompatibler (und funktioniert mit Sicherheit).



  • edit: missverständnis...



  • .filmor schrieb:

    Entweder:

    class Dataset;
    
    struct DatasetLess
    {
        bool operator () (const Dataset *d1, const Dataset *d2) const
        {
            return *d1 < *d2;
        }
    };
    
    std::set<Dataset*, DatasetLess> liste;
    

    oder:

    class Dataset;
    
    bool DatasetLess(const Dataset *d1, const Dataset *d2)
    {
       return *d1 < *d2;
    }
    
    std::set<Dataset*, bool (const Dataset*, const Dataset*)> liste (&DatasetLess);
    

    Ersteres ist wahrscheinlich kompatibler (und funktioniert mit Sicherheit).

    das hab ich ja noch nie bei der STL gesehen, das man einen funktionspointer uebergibt oder nur nen Klassennamen. was passiert da intern das der sowas haben will ? ansonsten uebergibt man doch immer ein functor-object oder eine statische/globale funktion.

    kann mir das jemand erklaeren ?

    Meep Meep



  • Beim Ersten ist das ganz simpel. Der Vergleicher wird, wenn du kein Objekt des Vergleichtyps übergibst, standardkonstruiert. Das set hat also immer seinen persönlichen Vergleicher dabei, den es dann bei jeglichen Operationen mit comp(lhs, rhs) benutzt. Wenn du keinen Typ angibst, dann wird std::less<Key> verwendet, was ziemlich genau so aussieht, wie DatasetLess, nur halt ohne Dereferenzierung.

    Im zweiten Fall (also der eigentlichen Korrektur deines Codes) muss dieser Typ der eines Funktionszeigers sein (DatasetLess ist dort /kein/ Typ!). Der Standardkonstruktor reicht für diesen nicht aus, also musst du noch ein Objekt (hier einen Funktionszeiger auf die DatasetLess-Funktion) übergeben.


Anmelden zum Antworten