检查以下代码:
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
,它们必须等效。将等效元素插入集合不会执行任何操作。