Std :: multimap <key, value> और std :: map <key, std :: set <value>> के बीच अंतर क्या है


जवाबों:


51

मल्टीमैप (कुंजी, मूल्य) के जोड़े को संग्रहीत करता है जहां कुंजी और मूल्य दोनों कई बार दिखाई दे सकते हैं।

map<key, set<value>>केवल एक विशिष्ट कुंजी के लिए एक बार प्रत्येक मान संग्रहीत करेगा। ऐसा करने के लिए, यह मानों की तुलना करने में सक्षम होना चाहिए, न कि केवल चाबियाँ।

यह आपके आवेदन पर निर्भर करता है कि क्या समान की तुलना करने वाले मान समान हैं, या यदि आप उन्हें अलग से स्टोर करना चाहते हैं। शायद उनके पास ऐसे क्षेत्र हैं जो अलग-अलग हैं लेकिन सेट की तुलना में भाग नहीं लेते हैं।


5
तो, एक std :: multimap <key, value> एक std :: map <key, std :: multiset <value>> की तरह है, उनके बीच का अंतर यह है कि बाद के मानों को क्रमबद्ध किया जाता है। क्या वह सही है?
大 大

2
नहीं, std::multimap<key, value>एक ही कुंजी को कई बार प्रदर्शित होने की अनुमति देता है जबकि std::map<key, whatever>की विशिष्टता की आवश्यकता होती है key
लियू लियू

74

std::mapएक साहचर्य कंटेनर है, जो आपको अपने प्रकार के मूल्य से जुड़ी एक अद्वितीय कुंजी रखने की अनुमति देता है। उदाहरण के लिए,

void someFunction()
{
    typedef std::map<std::string, int> MapType;
    MapType myMap;

    // insertion
    myMap.insert(MapType::value_type("test", 42));
    myMap.insert(MapType::value_type("other-test", 0));

    // search
    auto it = myMap.find("test");
    if (it != myMap.end())
        std::cout << "value for " << it->first << " is " << it->second << std::endl;
    else
        std::cout << "value not found" << std::endl;
}

A std::multimapबराबर है std::map, लेकिन आपकी कुंजियाँ अब अद्वितीय नहीं हैं। इसलिए आप केवल एक अद्वितीय आइटम खोजने के बजाय कई मदों को पा सकते हैं। उदाहरण के लिए,

void someFunction()
{
    typedef std::multimap<std::string, int> MapType;
    MapType myMap;

    // insertion
    myMap.insert(MapType::value_type("test", 42));
    myMap.insert(MapType::value_type("test", 45));
    myMap.insert(MapType::value_type("other-test", 0));

    // search
    std::pair<auto first, auto second> range = myMap.equal_range("test");
    for (auto it = range.first; it != range.second; ++it)
        std::cout << "value for " << it->first << " can be " << it->second << std::endl;
}

std::setएक की तरह है std::map, लेकिन यह एक मूल्य से जुड़े एक प्रमुख भंडारण नहीं है। यह केवल कुंजी प्रकार को संग्रहीत करता है, और आपको आश्वासन देता है कि यह सेट के भीतर अद्वितीय है।

आपके पास भी std::multisetवही है, जो समान पैटर्न का अनुसरण करता है।

ये सभी कंटेनर अपनी खोज / समान_ व्यवस्था के साथ एक ओ (लॉग (एन)) प्रदान करते हैं।


6
मल्टीमैप फ़ंक्शन में, यह रेखा std::pair<auto first, auto second> range = myMap.equal_range("test");काम नहीं करती है, क्योंकि error: 'auto' not allowed in template argumentconst auto range = myMap.equal_range("test")इसके बजाय उपयोग करें ।
vancexu

2
नक्शा प्रकार? क्या यह रेखा 4 पर मैप टाइप नहीं होना चाहिए?
लोलोलोल ओल

यकीन नहीं है कि पहले कौन था, लेकिन एक स्पष्ट रूप से दूसरे की कॉपी पेस्ट है: cppbuzz.com/What-is-difference-between-map-and-multimap
idclev 463035818

1
अहा, cppbuzz StackOverflow को स्क्रैप कर रहा है या क्या?, मैंने यह जवाब खुद सालों पहले लिखा था जब मैं अभी भी c ++ में दैनिक कोडिंग कर रहा था। और वास्तव में एक टाइपो लाइन 4 है, धन्यवाद @lololololol
typedef

1
(और उनकी कॉपी / पेस्ट विफल हो गया, वे टेम्पलेट std :: मैप डिक्लेरेशन: std :: map <std :: string, int>) में टाइप प्रकार भी प्रदर्शित नहीं करते हैं
टाइप

13
map::insert

क्योंकि mapकंटेनर डुप्लिकेट कुंजी मानों की अनुमति नहीं देते हैं, प्रत्येक तत्व के लिए सम्मिलन ऑपरेशन जांचता है कि क्या कोई अन्य तत्व कंटेनर में पहले से ही मौजूद है या नहीं यदि एक ही कुंजी मान है, तो तत्व डाला नहीं गया है और इसका मैप किया गया मान किसी भी तरह से नहीं बदला गया है।

दूसरी ओर

multimap::insert 

एक ही कुंजी के साथ किसी भी आइटम को सम्मिलित कर सकते हैं।

http://www.cplusplus.com/reference/stl/map/
http://www.cplusplus.com/reference/stl/multimap/


दोनों अंतर पर अच्छा लिंक और यह आंतरिक रूप से कैसे काम करता है। लिंक
Rndp13

10

उत्तरार्द्ध की आवश्यकता है कि मूल्यों का आदेश दिया जा सकता है (या तो operator<या तुलना-फ़ंक्शन के माध्यम से ), पूर्व नहीं करता है।


ऐसा प्रतीत होता है कि ऑपरेटर <मैप या मल्टीमैप दोनों पर ही काम करता है? en.cppreference.com/w/cpp/container/map/operator_cmp
johnbakers

हां, लेकिन मेरे जवाब ने मूल्यों के आदेश का उल्लेख किया। मान लीजिए कि आपके पास एक प्रकार है Tजो क्रमबद्ध नहीं है। आप इसका उपयोग a बनाने के लिए कर सकते हैं std::multimap<U, T>, लेकिन आप a बनाने के लिए उपयोग नहीं कर सकते std::map<U, std::set<T> >
ब्योर्न पोलेक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.