【发布时间】:2010-10-30 05:53:22
【问题描述】:
检查以下代码:
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++ 中进行任何类型的转换。在这种情况下,您应该完全删除强制转换,并改用正确的类型。 IE。而不是
(int) res.size(),删除演员表并将i的类型更改为unsigned。 -
另外,
i应该在循环中声明,而不是在循环之外。而在 C++ 中,toLowerCase 可能应该只调用std::transform(str.begin(), str.end(), str.begin(), std::ptr_fun(tolower))而不是编写显式循环。 -
@Billy ONeal:谢谢。我需要习惯使用
transform()。toLowerCase是我多年前写的。我想我当时不知道transform。我会更新我的代码库。
标签: c++ stl comparator