controllare il codice seguente:Utilizzando comparatore per STL set
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;
}
L'output è:
aLeague
BLeague
che è scioccante per me. Ho pensato (e in attesa) l'output sarà:
aLeague
ALeague
BLeague
Prima dell'esecuzione del leagues.insert("ALeague");
, il leagues
contiene "aLeague"
e "BLeague"
. La mia domanda è, mentre eseguo leagues.insert("ALeague");
perché la macchina tratta "ALeague" == "aleague"
? Secondo la mia comprensione, non esiste alcun elemento "ALeague"
in leagues
. Quindi "ALeague"
deve essere inserito in leagues
. Il comparatore dovrebbe determinare dove mettere "ALeague"
.
Grazie in anticipo.
PS: Per favore non mi colpisca per l'utilizzo del cast di stile C. : P Sono troppo pigro per digitare static_cast
.
Il fatto che ci si sente si deve lavorare per eseguire un C getto stile ++ è uno dei principali ragione C++ calchi stile esisti - vale a dire che si dovrebbe evitare qualsiasi tipo di fusione in C++. In questo caso è necessario rimuovere completamente i cast e utilizzare invece i tipi corretti. Cioè invece di '(int) res.size()', rimuovi il cast e cambia il tipo di 'i' in' unsigned'. –
Inoltre, 'i' deve essere dichiarato nel ciclo, non al di fuori del ciclo. E in C++, toLowerCase dovrebbe probabilmente chiamare 'std :: transform (str.begin(), str.end(), str.begin(), std :: ptr_fun (tolower))' invece di scrivere un ciclo esplicito. –
@Billy ONeal: grazie.ho bisogno di essere usato per usare 'transform()'. che 'toLowerCase' è stato scritto da me molti anni fa. Penso che non sapessi di 'transform' in quel momento. aggiornerò il mio codice base. – Donotalo