检查以下代码:

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

在执行leagues.insert("ALeague");之前,leagues包含"aLeague""BLeague"。我的问题是,在执行leagues.insert("ALeague");时,为什么机器会处理"ALeague" == "aleague"?根据我的理解,"ALeague"中没有元素leagues。因此,应将"ALeague"插入leagues中。比较器应确定将"ALeague"放在哪里。

提前致谢。

PS:请不要因为使用C样式转换而打我。 :P我太懒了,无法输入static_cast

最佳答案

由于toLowerCase,您的比较器说"aLeague" == "ALeague"。由于(根据您的比较器)"aLeague" < "ALeague" == false"ALeague" < "aLeague" == false,它们必须等效。将等效元素插入集合不会执行任何操作。

07-27 17:57