Verificar el siguiente código:comparador para STL establece
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;
}
La salida es:
aLeague
BLeague
que es chocante para mí. Pensé (y esperando) la salida sería:
aLeague
ALeague
BLeague
Antes de la ejecución de leagues.insert("ALeague");
, la leagues
contiene "aLeague"
y "BLeague"
. Mi pregunta es, al ejecutar leagues.insert("ALeague");
por qué la máquina trata "ALeague" == "aleague"
? De acuerdo con mi entendimiento, no existe el elemento "ALeague"
en leagues
. Por lo tanto, "ALeague"
se debe insertar en leagues
. El comparador debe determinar dónde poner "ALeague"
.
Gracias de antemano.
PD: Por favor, no me pegue para usar el molde de estilo C. : P Soy demasiado flojo para escribir static_cast
.
El hecho de que se siente que tiene que trabajar para realizar una C++ fundido estilo es uno de los principales razón C moldes estilo ++ existe - es decir, que se debe evitar cualquier tipo de colada en C++. En este caso, debe eliminar los moldes completamente, y usar los tipos correctos en su lugar. Es decir. en lugar de '(int) res.size()', elimine el molde y cambie el tipo de 'i' para que sea' unsigned'. –
Además, 'i' debe declararse en el ciclo, no fuera del ciclo. Y en C++, toLowerCase probablemente debería simplemente llamar a 'std :: transform (str.begin(), str.end(), str.begin(), std :: ptr_fun (tolower))' en lugar de escribir un bucle explícito. –
@Billy ONeal: gracias.necesito ser usado para usar 'transform()'. que 'toLowerCase' fue escrito por mí hace muchos años. Creo que no sabía sobre 'transformar' en ese momento. actualizaré mi base de código. – Donotalo