मैंने पाया कि उनके पास एक कुंजी और कई मान हैं जो अद्वितीय हैं।
जवाबों:
मल्टीमैप (कुंजी, मूल्य) के जोड़े को संग्रहीत करता है जहां कुंजी और मूल्य दोनों कई बार दिखाई दे सकते हैं।
map<key, set<value>>
केवल एक विशिष्ट कुंजी के लिए एक बार प्रत्येक मान संग्रहीत करेगा। ऐसा करने के लिए, यह मानों की तुलना करने में सक्षम होना चाहिए, न कि केवल चाबियाँ।
यह आपके आवेदन पर निर्भर करता है कि क्या समान की तुलना करने वाले मान समान हैं, या यदि आप उन्हें अलग से स्टोर करना चाहते हैं। शायद उनके पास ऐसे क्षेत्र हैं जो अलग-अलग हैं लेकिन सेट की तुलना में भाग नहीं लेते हैं।
std::multimap<key, value>
एक ही कुंजी को कई बार प्रदर्शित होने की अनुमति देता है जबकि std::map<key, whatever>
की विशिष्टता की आवश्यकता होती है key
।
ए 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
वही है, जो समान पैटर्न का अनुसरण करता है।
ये सभी कंटेनर अपनी खोज / समान_ व्यवस्था के साथ एक ओ (लॉग (एन)) प्रदान करते हैं।
std::pair<auto first, auto second> range = myMap.equal_range("test");
काम नहीं करती है, क्योंकि error: 'auto' not allowed in template argument
। const auto range = myMap.equal_range("test")
इसके बजाय उपयोग करें ।
map::insert
क्योंकि map
कंटेनर डुप्लिकेट कुंजी मानों की अनुमति नहीं देते हैं, प्रत्येक तत्व के लिए सम्मिलन ऑपरेशन जांचता है कि क्या कोई अन्य तत्व कंटेनर में पहले से ही मौजूद है या नहीं यदि एक ही कुंजी मान है, तो तत्व डाला नहीं गया है और इसका मैप किया गया मान किसी भी तरह से नहीं बदला गया है।
दूसरी ओर
multimap::insert
एक ही कुंजी के साथ किसी भी आइटम को सम्मिलित कर सकते हैं।
http://www.cplusplus.com/reference/stl/map/
http://www.cplusplus.com/reference/stl/multimap/
उत्तरार्द्ध की आवश्यकता है कि मूल्यों का आदेश दिया जा सकता है (या तो operator<
या तुलना-फ़ंक्शन के माध्यम से ), पूर्व नहीं करता है।
T
जो क्रमबद्ध नहीं है। आप इसका उपयोग a बनाने के लिए कर सकते हैं std::multimap<U, T>
, लेकिन आप a बनाने के लिए उपयोग नहीं कर सकते std::map<U, std::set<T> >
।