[c++] सी ++ std :: मानचित्र में कोई दी गई कुंजी मौजूद है या नहीं



Answers

यह देखने के लिए कि मानचित्र में कोई विशेष कुंजी मौजूद है या नहीं, count सदस्य फ़ंक्शन का निम्न तरीकों से उपयोग करें:

m.count(key) > 0
m.count(key) == 1
m.count(key) != 0

map::find लिए documentation कहता है: "एक अन्य सदस्य कार्य, map::count उपयोग यह जांचने के लिए किया जा सकता है कि कोई विशेष कुंजी मौजूद है या नहीं।"

map::count लिए map::count कहता है: "क्योंकि नक्शा कंटेनर में सभी तत्व अद्वितीय हैं, फ़ंक्शन केवल 1 (यदि तत्व पाया जाता है) या शून्य (अन्यथा) लौटा सकता है।"

मानचित्र से मूल्य को उस कुंजी के माध्यम से प्राप्त करने के लिए जिसे आप अस्तित्व में जानते हैं, map::at उपयोग map::at :

value = m.at(key)

map::operator[] विपरीत map::operator[] , map::at अगर निर्दिष्ट कुंजी मौजूद नहीं है तो मानचित्र में एक नई कुंजी नहीं बनाई जाएगी।

Question

मैं यह जांचने की कोशिश कर रहा हूं कि किसी दिए गए कुंजी को मानचित्र में रखा गया है और कुछ हद तक ऐसा नहीं कर सकता है:

typedef map<string,string>::iterator mi;
map<string, string> m;
m.insert(make_pair("f","++--"));
pair<mi,mi> p = m.equal_range("f");//I'm not sure if equal_range does what I want
cout << p.first;//I'm getting error here

तो मैं पी में क्या प्रिंट कर सकता हूं?




map<string, string> m;

जांच कुंजी मौजूद है या नहीं, और घटना की वापसी संख्या (मानचित्र में 0/1):

int num = m.count("f");  
if (num>0) {    
    //found   
} else {  
    // not found  
}

जांच कुंजी मौजूद है या नहीं, और iterator वापस:

map<string,string>::iterator mi = m.find("f");  
if(mi != m.end()) {  
    //found  
    //do something to mi.  
} else {  
    // not found  
}  

आपके प्रश्न में, खराब operator<< कारण त्रुटि operator<< अधिभार, क्योंकि p.first map<string, string> , आप इसे प्रिंट नहीं कर सकते हैं। इसे इस्तेमाल करे:

if(p.first != p.second) {
    cout << p.first->first << " " << p.first->second << endl;
}



m.find == m.end() // not found 

यदि आप अन्य एपीआई का उपयोग करना चाहते हैं, तो m.count(c)>0

 if (m.count("f")>0)
      cout << " is an element of m.\n";
    else 
      cout << " is not an element of m.\n";



map <int , char>::iterator itr;
    for(itr = MyMap.begin() ; itr!= MyMap.end() ; itr++)
    {
        if (itr->second == 'c')
        {
            cout<<itr->first<<endl;
        }
    }



template <typename T, typename Key>
bool key_exists(const T& container, const Key& key)
{
    return (container.find(key) != std::end(container));
}

बेशक अगर आप फैनसीयर प्राप्त करना चाहते हैं तो आप हमेशा एक फ़ंक्शन को टेम्पलेट कर सकते हैं जिसमें एक फ़ंक्शन और कोई फ़ंक्शन नहीं मिला है, ऐसा कुछ:

template <typename T, typename Key, typename FoundFunction, typename NotFoundFunction>
void find_and_execute(const T& container, const Key& key, FoundFunction found_function, NotFoundFunction not_found_function)
{
    auto& it = container.find(key);
    if (it != std::end(container))
    {
        found_function(key, it->second);
    }
    else
    {
        not_found_function(key);
    }
}

और इस तरह इसका इस्तेमाल करें:

    std::map<int, int> some_map;
    find_and_execute(some_map, 1,
        [](int key, int value){ std::cout << "key " << key << " found, value: " << value << std::endl; },
        [](int key){ std::cout << "key " << key << " not found" << std::endl; });

इसका नकारात्मक पक्ष एक अच्छे नाम के साथ आ रहा है, "find_and_execute" अजीब है और मैं अपने सिर के ऊपर से कुछ भी बेहतर नहीं कर सकता ...






Related