निम्न कोड की जाँच करें:का प्रयोग तुलनित्र सेट
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"
कहां रखा जाए।
अग्रिम धन्यवाद।
पीएस: कृपया मुझे सी शैली कास्ट का उपयोग करने के लिए मत मारो। : पी static_cast
टाइप करने के लिए मैं बहुत आलसी हूं।
तथ्य यह महसूस करता है कि आप एक C++ शैली डाली मुख्य कारण C++ शैली डाले में से एक है प्रदर्शन करने के लिए काम करना है मौजूद - अर्थात् है कि आप कास्टिंग के किसी भी प्रकार से बचना चाहिए सी ++ में। इस मामले में आपको पूरी तरह से कास्ट को हटा देना चाहिए, और इसके बजाय सही प्रकारों का उपयोग करना चाहिए। अर्थात। '(int) res.size()' के बजाय, कास्ट हटाएं और 'i' के प्रकार को 'हस्ताक्षरित' के रूप में बदलें। –
इसके अलावा, 'i' को लूप में घोषित किया जाना चाहिए, लूप के बाहर नहीं। और सी ++ में, toLowerCase शायद एक स्पष्ट लूप लिखने के बजाय 'std :: transform (str.begin(), str.end(), str.begin(), std :: ptr_fun (tolower)) को कॉल करना चाहिए। –
@ बिली ओनेल: धन्यवाद।मुझे 'ट्रांसफॉर्म() 'का उपयोग करने के लिए इस्तेमाल करने की आवश्यकता है। कि 'toLowerCase' कई साल पहले मेरे द्वारा लिखा गया था। मुझे लगता है कि उस समय मुझे 'ट्रांसफॉर्म' के बारे में पता नहीं था। मैं अपना कोडबेस अपडेट करूंगा। – Donotalo