检查下面的代码:对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
的leagues.insert("ALeague");
执行之前,leagues
包含"aLeague"
和"BLeague"
。我的问题是,当执行leagues.insert("ALeague");
为什么机器对待"ALeague" == "aleague"
?根据我的理解,leagues
中没有元素"ALeague"
。所以"ALeague"
应该插入leagues
。比较器应该确定在哪里放"ALeague"
。
在此先感谢。 PS:请不要打我使用C风格演员。 :P我懒得输入static_cast
。
这感觉,你必须努力执行的C++风格的转换是主要原因C++风格转换的一个存在的事实 - 即你应该避免任何形式的铸造在C++中。在这种情况下,您应该完全删除这些转换,然后使用正确的类型。即而不是'(int)res.size()',删除转换并将'i'的类型改为'unsigned'。 – 2010-10-30 06:06:09
另外,'i'应该在循环中声明,而不是在循环之外。在C++中,toLowerCase可能应该调用'std :: transform(str.begin(),str.end(),str.begin(),std :: ptr_fun(tolower))'而不是编写显式循环。 – 2010-10-30 06:11:17
@Billy ONeal:谢谢。我需要使用'transform()'。 “toLowerCase”是我多年前写的。我想我当时并不知道“变革”。我会更新我的代码库。 – Donotalo 2010-10-30 17:30:13