次のコードを確認してください。
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
。