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,它们必须是相同的.将等效元素插入集合中不会做任何事情.
| 归档时间: |
|
| 查看次数: |
12048 次 |
| 最近记录: |