Использование компаратора для набора STL

Проверьте следующий код:

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 .

5
задан Donotalo 30 October 2010 в 05:53
поделиться