2013-09-30 9 views
11

मैं stl के लिए नया हूँ। मेरा नीचे कार्यक्रम है।stl बनाने के लिए कैसे करें :: मानचित्र कुंजी केस असंवेदनशील

typedef pair<string, int> p; 
int main(int argc, char *argv[]) 
{ 
    map<string,int> st; 
    st.insert(p("hello",1)); //Inserted "hello" as key to map. 
    st.insert(p("HELLO",1)); //Inserted "HELLO" as key to map. 
    cout<<"size="<<st.size()<<endl; //Output is 2 because two records found "hello" and "HELLO" 
    return 0; 
} 

मैं (मामले शब्द या इसके विपरीत कम करने के लिए अपर केस) दोहराया मामले परिवर्तन के कारण लेने के लिए नहीं करना चाहती। यहां "st.insert (पी (" हेल्लो ", 1));" असफल होना चाहिए, इसलिए नहीं। रिकॉर्ड के "2" के बजाय "1" होना चाहिए। क्या कोई ध्वज सेटअप है या ऐसा है?

मैं इस प्रश्न को पोस्ट करने के लिए संबंधित प्रश्न नहीं ढूंढ पाया।

कोई भी मदद आभारी है।

+3

मानचित्र में जोड़ने से पहले उन्हें कम मामले में बदलने का सबसे आसान तरीका है। – zch

उत्तर

26

एक कस्टम तुलनित्र का उपयोग करें:

struct comp { 
    bool operator() (const std::string& lhs, const std::string& rhs) const { 
     return stricmp(lhs.c_str(), rhs.c_str()) < 0; 
    } 
}; 

std::map<std::string, int, comp> st; 

संपादित करें: आप stricmp या strcasecmp उपयोग उपयोग करने में सक्षम नहीं हैं, तो:

#include<algorithm> 
//... 
string tolower(string s) { 
    std::transform(s.begin(), s.end(), s.begin(), ::tolower); 
    return s; 
} 
struct comp { 
    bool operator() (const std::string& lhs, const std::string& rhs) const { 
     return tolower(lhs) < tolower(rhs); 
    } 
}; 

std::map<std::string, int, comp> st; 
+6

मैं दूसरे विकल्प ('tolower' फ़ंक्शन के साथ) की अनुशंसा नहीं करता क्योंकि यह एक नई स्ट्रिंग बनाता है। जिसका अर्थ है 'कुछ' और 'प्रति तुलना प्रति तुलना ऑपरेटर'। जो आपको धीरे-धीरे धीमा कर देगा। इसके अलावा यह 'ओ (1) 'औसत से तुलना करता है (अधिकांश तार पहले वर्ण में भिन्न होते हैं)' ओ (एस) 'जहां एस स्ट्रिंग का औसत आकार होता है। तो एक चरित्र की तुलना के बजाय आपको 2 'नया', 2 'हटाएं', 2xs 'tolower' ... नहीं मिलता है। – rabensky

+0

क्या आप समझा सकते हैं कि वापसी क्यों है <0 और नहीं == 0? मैंने str *** cmp फ़ंक्शंस के साथ सोचा, शून्य से कम इंगित करता है कि बाएं हाथ की ओर दाएं हाथ का एक सबस्ट्रिंग है, जहां एक बराबर मैच 0. –

+1

@TechnikEmpire नक्शा "कम से कम" तुलना पर आधारित है: डिफ़ॉल्ट तुलनित्र 'std :: less' predicate है। यह जांचकर यहां वही व्यवहार हासिल किया जाता है कि 'stricmp (lhs, rhs) '0 से कम है या नहीं। –

2

रहे हैं दो इस

करने के लिए तरीके

पहला - केस

0 को अनदेखा करने के लिए "तुलना" फ़ंक्शन को बदलें

दूसरा - जब भी आप किसी स्ट्रिंग का उपयोग मानचित्र से मूल्य डालते हैं या प्राप्त करते हैं, तो उसे उस फ़ंक्शन से लपेटें जो इसे लोअरकेस में बदल देता है।

सब आप एक "समारोह वर्ग" बनाने करने की जरूरत है पहली लिए (ऑपरेटर के साथ एक वर्ग()) है कि दो तार और रिटर्न प्राप्त करता है कि क्या छोड़ दिया है "छोटे" सही से:

struct my_comparitor{ 
    bool operator()(const std::string &a, const std::string &b){ 
    // return iwhether a<b 
    } 
}; 

std::map<std::string,DATA_TYPE,my_comparitor> my_map; 

पल के लिए सिर्फ इस कार्य करें:

std::map<std::string,DATA_TYPE> my_map; 
my_map.insert(std::make_pair(TO_LOWERCASE("hello"),1)); 
iter=my_map.find(TO_LOWERCASE(key)); 
cout << my_map[TO_LOWERCASE(name)]; 
// etc. 

मैं एक समारोह को लोअरकेस में बदल देती है कि पहले से ही एसटीएल का हिस्सा है, तो यकीन नहीं है - लेकिन किसी भी तरह से यह लिखने के लिए आसान है।

संबंधित मुद्दे