Überprüfen Sie den folgenden Code ein:Mit Komparator für STL eingestellt
string toLowerCase(const string& str) {
string res(str);
int i;
for (i = 0; i < (int) res.size(); i++)
res[i] = (char) tolower(res[i]);
return res;
}
class LeagueComparator
{
public:
bool operator()(const string& s1, const string& s2)
{
return toLowerCase(s1) < toLowerCase(s2);
}
};
int main()
{
set<string, LeagueComparator> leagues;
set<string, LeagueComparator>::iterator iter;
leagues.insert("BLeague");
leagues.insert("aLeague"); // leagues = {"aLeague", "BLeague"}
leagues.insert("ALeague");
for (iter = leagues.begin(); iter != leagues.end(); iter++)
cout << *iter << endl;
return 0;
}
Die Ausgabe lautet:
aLeague
BLeague
die mir schockierend ist. Ich dachte (und erwartete) die Ausgabe wäre:
aLeague
ALeague
BLeague
Vor der Ausführung von leagues.insert("ALeague");
, die leagues
enthält "aLeague"
und "BLeague"
. Meine Frage ist, während der Ausführung leagues.insert("ALeague");
, warum die Maschine behandelt "ALeague" == "aleague"
? Nach meinem Verständnis gibt es kein Element "ALeague"
in leagues
. So sollte "ALeague"
in leagues
eingefügt werden. Der Vergleicher sollte bestimmen, wo "ALeague"
zu setzen ist.
Vielen Dank im Voraus.
PS: Bitte schlagen Sie mich nicht für die Verwendung von C-Style-Cast. : P Ich bin zu faul, um static_cast
einzugeben.
Die Tatsache, dass es sich anfühlt Sie eine C++ Casts ist eines der Hauptgrund, C++ Casts existieren arbeiten müssen auszuführen - nämlich, dass Sie jede Art von Gießen vermeiden sollten in C++. In diesem Fall sollten Sie die Würfe vollständig entfernen und stattdessen die richtigen Typen verwenden. I.e. anstelle von '(int) res.size()', entferne den Cast und ändere 'i's Type in' unsigned'. –
Außerdem sollte 'i' in der Schleife deklariert werden, nicht außerhalb der Schleife. Und in C++ sollte toLowerCase wahrscheinlich einfach 'std :: transform (str.begin(), str.end(), str.begin(), std :: ptr_fun (tolower))' aufrufen, anstatt eine explizite Schleife zu schreiben. –
@Billy ONeal: Danke.Ich muss verwendet werden, um 'transform()' zu verwenden. das 'toLowerCase' wurde vor vielen Jahren von mir geschrieben. Ich glaube, ich wusste zu dieser Zeit noch nichts von 'transform '. Ich werde meine Codebasis aktualisieren. – Donotalo