2012-10-15 24 views
7

कैसे काम करता है यह प्रश्न सीधे using char as a key in stdmap से संबंधित है।std :: मैप में एक कुंजी के रूप में char * का उपयोग करके, यह

मैं समझता हूं कि तुलनात्मक कार्य क्या करता है और इसकी आवश्यकता char * प्रकारों के लिए क्यों की जाती है। हालांकि, मैं अनिश्चित हूं कि अद्यतन वास्तव में कैसे काम करता है।

मैं उस मामले के बारे में उत्सुक हूं जहां आप एक कुंजी अपडेट कर रहे हैं। std::map कैसे const char *, cmp_str के बीच समानता की तुलना करने के बारे में जानता है केवल पेड़ में डालने वाली कुंजी को ऑर्डर करने के लिए बताता है।

मैंने stl_tree.h कोड (pulled from here) में थोड़ा खोद दिया है लेकिन बहुत कुछ नहीं मिला। मेरा एकमात्र अनुमान यह है कि यह सीधे स्मृति तुलना कर रहा है।

मुझे इस बात की दिलचस्पी है कि अंडरलिंग stl_tree कक्षा इस स्थिति को कैसे संभालती है, या अगर यह सही ढंग से इसे संभाल नहीं पाती है, तो किनारे का मामला तोड़ता है?

कोड

#include <map> 
#include <iostream> 
#include <cstring> 

struct cmp_str 
{ 
    bool operator()(char const *a, char const *b) 
    { 
     return std::strcmp(a, b) < 0; 
    } 
}; 

int main (int argc, char ** argv) 
{ 

    std::map<const char*, int, cmp_str> map; 

    map["aa"] = 1; 
    map["ca"] = 2; 
    map["ea"] = 3; 
    map["ba"] = 4; 

    map["ba"] = 5; 
    map["bb"] = 6; 

    map["ba"] = 7; 

    std::map<const char*, int, cmp_str>::iterator it = map.begin(); 
    for (; it != map.end(); it++) 
    { 
     std::cout << (*it).first << ": " << (*it).second << std::endl; 
    } 

    return 0; 

} 

आउटपुट

aa: 1 
ba: 7 
bb: 6 
ca: 2 
ea: 3 
+0

मुझे लगता है कि यह एक memcmp प्रकार ऑपरेशन गहराई से है। – Whyrusleeping

+1

कोई विशेष कारण है कि आप कुंजी के रूप में 'std :: string' का उपयोग क्यों नहीं करते हैं? – nneonneo

+0

मेरे प्रोफेसर ने उपर्युक्त 'cmp_str' फ़ंक्शन लिखा और मैंने सवाल उठाया, उसके पास इस सवाल का जवाब नहीं था। मैंने कुछ परीक्षण चलाए और किनारे के मामले में तोड़ने में सक्षम नहीं थे, लेकिन मैं अभी भी काम करता हूं कि यह कैसे काम करता है, क्योंकि मुझे लगता है कि यह तालिका में एक और प्रविष्टि डालेगा। – travis

उत्तर

6

आदेश दिया कंटेनरों सभी तुल्यता कक्षाओं का उपयोग !(a < b) && !(b < a) या, यदि आप अंकन एक द्विआधारी विधेय !pred(a, b) && !pred(b, a) के प्रयोग पर जोर देते हैं।

नोट, कि आपको पॉइंटर्स को अपने मानचित्र में रखने की आवश्यकता है: यदि पॉइंटर्स दायरे से बाहर निकलते हैं तो आपको अजीब परिणाम मिलेंगे। बेशक, स्ट्रिंग अक्षर कार्यक्रम के पूरे जीवनकाल में मान्य रहते हैं।

6

खैर, cmp_str समान कुंजी खोजने के लिए इस्तेमाल किया जा सकता। यदि cmp_str::operator(x,y) और cmp_str::operator(y,x) दोनों false पर लौटें, तो आपको डुप्लिकेट कुंजी मिल गई है। वास्तव में इसके लिए बहुत कुछ नहीं है। दो मूल्यों a और b अगर दोनों में से कोई अन्य की तुलना में छोटा होता है बराबर माना जाता है:

+0

@ प्रेटोरियन यूप, thx। –

+1

डाउनवोट पर एक टिप्पणी रचनात्मक होगी। –