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.