Проверьте следующий код:
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;
}
Результат:
aLeague
BLeague
, что меня шокирует. Я думал (и ожидал), что результат будет следующим:
aLeague
ALeague
BLeague
До выполнения league.insert ("ALeague");
, лига
содержит "aLeague"
и "BLeague"
. У меня вопрос: при выполнении league.insert ("ALeague");
, почему машина обрабатывает "ALeague" == "aleague"
? Насколько я понимаю, в лигах
нет элемента «ALeague»
. Поэтому «ALeague»
нужно вставить в лиги
. Компаратор должен определить, куда поместить "ALeague"
.
Заранее спасибо.
PS: Пожалуйста, не бейте меня за использование приведений в стиле C. : P Мне лень набирать static_cast
.