Sprawdź poniższy kod:Korzystanie komparator dla STL ustawić
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;
}
wyjście jest:
aLeague
BLeague
co jest szokujące dla mnie. Myślałem (i spodziewa) wyjście byłoby:
aLeague
ALeague
BLeague
Przed wykonaniem leagues.insert("ALeague");
The leagues
zawiera "aLeague"
i "BLeague"
. Moje pytanie brzmi: podczas wykonywania leagues.insert("ALeague");
, dlaczego maszyna traktuje "ALeague" == "aleague"
? Zgodnie z moim rozumieniem, nie ma elementu "ALeague"
w leagues
. Tak więc "ALeague"
należy wstawić do leagues
. Komparator powinien określić, gdzie umieścić "ALeague"
.
Z góry dziękuję.
PS: Proszę mnie nie uderzać za używanie obsady w stylu C. : P Jestem zbyt leniwy, aby wpisać static_cast
.
Fakt, że czuje trzeba pracować, aby wykonać C++ styl obsada jest jednym z głównych powodów C++ odlewów typu istnieje - a mianowicie, że należy unikać jakichkolwiek odlewania w C++. W takim przypadku należy całkowicie usunąć rzuty i zamiast tego użyć odpowiednich typów. To znaczy. zamiast '(int) res.size()', usuń rzutowanie i zmień typ 'i' na 'unsigned'. –
Ponadto, 'i' powinno być zadeklarowane w pętli, a nie poza pętlą. A w C++, doLowerCase powinien prawdopodobnie wywoływać 'std :: transform (str.begin(), str.end(), str.begin(), std :: ptr_fun (tolower))' zamiast pisać jawną pętlę. –
@Billy ONeal: dzięki.Muszę być używane do użycia 'transform()'. że 'toLowerCase' zostało napisane przeze mnie wiele lat temu. Myślę, że nie wiedziałem o "transformacji" w tym czasie. zaktualizuję moją bazę kodów. – Donotalo