bestehende Klassen/Strukturen verändern



  • Hallo,

    ich habe mir folgenden Code gebastelt damit Zeichenketten von der STL alphabetisch sortiert werden:
    //[...]
    string tolower(const string &str) // aus vcppk
    {
    string result=str;
    for(int i=0;i<result.size();++i)
    {
    result[i]=tolower(result[i]);
    }
    return result;
    }

    template<>
    inline bool less<string>::operator()(const string& __x, const string& __y) const
    {
    return tolower(__x) < tolower(__y);
    }
    //[...]
    und wollte jetzt mal wissen, ob man so etwas, also bestehende Klassen, oder in dem Fall Strukturen, verändern, lieber lassen sollte, oder es in Ordnung geht?



  • was sind das für Klassen die bestehen?



  • srz, hier nocheinmal schön:

    //[...]
    string tolower(const string &str) // aus vcppk
    {
        string result=str;
        for(int i=0;i<result.size();++i)
        {
            result[i]=tolower(result[i]);
        }
        return result;
    }
    
    template<>
    inline bool less<string>::operator()(const string& __x, const string& __y) const
    {
        return tolower(__x) < tolower(__y);
    }
    //[...]
    


  • Die Klasse less ist in der stl_funktions.h zu finden und wird per Template an z.B. den Vector übergeben, damit dieser weis, wie er Vergleichen soll!



  • dann ist es nichts empfehlenswert da drin rumzupfuschen



  • Ich will ja nicht die stl_funktions.h verändern, sondern nur die Klasse für einen bestimmten Fall ( string wird als Template übergeben ) spezifizieren; ist es dann erlaubt???



  • Wenn du die Neudefinition von less<>::operator() meinst, lass das lieber. Damit machst du vermutlich mehr kaputt als du verbesserst. Der sicherere Weg ist es, den Case-insensitiven Vergleich in einen eigenen Funktor zu packen und diesen immer mitzugeben, wenn du mit Strings arbeiten willst (STL-Klassen und -Algorithmen, die Elemente vergleichen können, bieten grundsätzlich die Möglichkeit, eigene Vergleichsfunktionen anstelle von < mitzugeben).

    PS: Die Alternative wäre es noch, den Vergleich in eine eigene char_traits-Version zu packen und damit direkt an die String-Klasse zu hängen. Vergleiche dazu meinen Magazin-Artikel über Stringverarbeitung.



  • Danke; sie haben wahrscheinlich wie immer Recht!

    CStoll schrieb:

    Wenn du die Neudefinition von less<>::operator() meinst, lass das lieber.[...]

    Ich will ja nichts großartig, sprich nicht alles, neudefinieren, sondern less nur in einem besimmten fall spezialiesieren! Kann ich da soo viel Kaputt machen???



  • Ja, kannst du - vor allem werden dann in deinem Programm "normale" Vergleiche (bei Direktaufruf von <, z.B. bei der Defaultversion von sort()) und tolower-Vergleiche (bei der Arbeit über less<>, z.B. bei einer set<string>) bunt durcheinandergewürfelt, ohne daß du wirklich beeinflussen kannst, wann welcher Fall eintritt. Mit einem eigenen Funktor kannst du explizit angeben, wann du was benötigst.


Anmelden zum Antworten