Set: Eigene Compare-Funktion



  • Hallo,

    Wie der Titel schon sagt 🙂
    Ich habe ein String-Set und möchte eine eigene Compare-Funktion statt des üblichen "less<>" oder "greater<>" verwenden, nur weiß ich leider nicht, wie.
    Einfach:

    bool comp(string &s1, string &s2)
    {
        //.. tut halt vergleichen ..
    }
    // ...
    
    set<string, comp> s;
    
    // ...
    

    geht nicht wirklich.
    Wie kann muß man solch eine Funktion definieren bzw. einbinden, damit es funktioniert ?



  • mach aus dem comp einen Operator, dann kannst du ihn als Template-Parameter übergeben:

    class mycomp : public binary_function<bool,string,string> // oder so?
    {
      bool operator()(const string& left,const string& right)
      {
        return left.size()<right.size();
      }
    }
    
    set<string,mycomp> myset;
    


  • es reicht:

    class mycomp
    {
      bool operator()(const string& left,const string& right) const
      {
        return left.size()<right.size();
      }
    }
    
    set<string,mycomp> myset;
    

    EDIT: const added



  • Funktioniert bestens. Danke!



  • Hallo,
    es geht natürlich auch mit einer Funktion:

    bool comp(const std::string& s1, const std::string& s2) {...}
    
    // der zweite Parameter ist ein *Typ*...
    typedef std::set<std::string, bool (*)(const std::string&, const std::string&)> StrSet;
    
    // ... der bei der Instanstziierung mit einem Wert belegt werden muss.
    // Verwendet man einen Funktionstyp, muss man im Ctor die konkrete Funktion angeben.
    StrSet s(comp);
    

Anmelden zum Antworten