使用比较器进行STL设置

Don*_*alo 5 c++ stl comparator

检查以下代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

输出是:

aLeague
BLeague
Run Code Online (Sandbox Code Playgroud)

这让我感到震惊.我认为(并期待)输出将是:

aLeague
ALeague
BLeague
Run Code Online (Sandbox Code Playgroud)

在执行之前leagues.insert("ALeague");,leagues包含"aLeague""BLeague".我的问题是,在执行leagues.insert("ALeague");机器处理的原因时"ALeague" == "aleague"?根据我的理解,没有元素"ALeague"leagues.所以"ALeague"应该插入leagues.比较器应确定放置的位置"ALeague".

提前致谢.

PS:请不要因为使用C风格的演员而打我.:P我懒得打字static_cast.

Joh*_*eek 14

你的比较器,感谢toLowerCase,说"aLeague" == "ALeague".由于(根据你的比较)"aLeague" < "ALeague" == false"ALeague" < "aLeague" == false,它们必须是相同的.将等效元素插入集合中不会做任何事情.

  • +1.注意比较器没有建立相等,它正在建立等价.标准和STL文档有所不同. (3认同)