2012-09-07 19 views
7

मेरे पास कुछ (काम करने वाला) कोड है जो multimap<string,string> का उपयोग करता है। मैं इसे एक ही कुंजी पर डुप्लिकेट मानों को अस्वीकार करने के लिए बदलना चाहता हूं (स्पष्ट रूप से एक ही कुंजी पर अलग-अलग मान ठीक हैं, अन्यथा मैं एक मल्टीमैप का उपयोग नहीं करता)।डुप्लिकेट जोड़े से कैसे बचें/मल्टीमैप में एक जोड़ी ढूंढें?

आश्चर्यजनक रूप से प्रकार seem नहीं है ताकि डुप्लीकेट से बचने के लिए अंतर्निहित तरीका न हो और न ही एक कुंजी-मूल्य जोड़ी (केवल एक कुंजी ढूंढने के लिए)। लेकिन मुझे लगता है कि एसओ पर किसी को तैयार किए गए कामकाज के लिए होना चाहिए। किसी को?

+0

डुप्लिकेट मान हैं जिनके पास अलग-अलग कुंजी हैं? आप कितनी चाबियाँ कई बार इस्तेमाल होने की उम्मीद करेंगे, और उस पर कितनी बार? – ypnos

+0

निश्चित रूप से, अलग-अलग कुंजियों पर एक ही मान ठीक है। मेरे मामले में प्रशंसक-बाहर छोटा होता है (आम तौर पर प्रति कुंजी 1 या 2 मान) तो मृतकजी के सुझाव 'std :: map > पर स्विच करने के लिए सुझाव' कुशल या सुविधाजनक नहीं है (चूंकि multimap आधारित कोड पहले ही लिखा गया है)। – Qwertie

उत्तर

3

यहाँ मैं के साथ आया है।)

+0

केवल एक चीज आप के लिए वापस आ इटरेटर का उपयोग तुलना है, तो क्यों बस वापस नहीं 'बजाय bool'? – jrok

+0

कौन जानता है, क्योंकि मैं (find_pair (...)) '' किसी दिन map.erase कर सकते हैं। एक contains_pair() आवरण काम भी वैसे हो सकता है,। – Qwertie

1

मेरा सुझाव आपको कक्षा में अपने मल्टीमैप को लपेटना होगा और उस विधि में सत्यापन करना होगा जहां आप मानचित्र में कुछ जोड़ते हैं। शेष कार्य बस मल्टीमैप के तरीकों से गुज़रेंगे। यह बहुत सारे बॉयलर प्लेट कोड बनाता है लेकिन यदि आपको कभी भी अन्य प्रकार की सत्यापन करने की आवश्यकता है तो यह इस तरह से आसान होगा।

+0

आपका सुझाव ओ (एन) समय होगा। – Puppy

0

ऐसा लगता है कि

 std::set<std::pair<std::string,std::string>>> 

बिल्कुल गुण आप देख रहे हैं होगा।

हालांकि यह नक्शा और न ही मल्टीमैप है। आप मल्टीमैप और कुंजी, वैल्यू जोड़े दोनों सेट रख सकते हैं या केवल स्थिरता की जांच के लिए इस सेट को बना सकते हैं।

मैं इस सेट का उपयोग करता हूं और इंटरफ़ेस को मल्टीमैप करने के लिए इसे एडाप्टर बना देता हूं। शायद यह लागू करने का सबसे आसान समाधान नहीं है, लेकिन सर्वोत्तम प्रदर्शन दक्षता के साथ।

संदर्भों के लिए "एडाप्टर डिज़ाइन पैटर्न" प्रश्न देखें।


[अद्यतन]

देखें मेरी working example एक प्रारंभ बिंदु के रूप।

उदा। कुंजी के लिए सभी मूल्यों पर पुनरावृति करने के लिए कैसे - देखें:

typedef std::set<std::pair<std::string, std::string> > ssset; 

ssset::iterator get_key(ssset& s, std::string key) 
{ 
    ssset::iterator it = s.lower_bound(std::make_pair(key, "")); 
    if (it != s.end() && it->first == key) return it; 
    return s.end(); 
} 

for (ssset::iterator it = get_key(s, "abc"); it != s.end() && it->first == "abc"; ++it) 
    std::cout << it->first << "->" << it->second << std::endl; 
+0

समस्या यह है कि अब मैं एक कुंजी से जुड़े मूल्य (ओं) के लिए नहीं पूछ सकता, क्योंकि एक जोड़ी खोज के लिए आवश्यक है। – Qwertie

+0

आप निम्न सीमा (कुंजी, "") के लिए खोज सकते हैं। यदि कुंजी के साथ पाया जाता है तो यह पहला मान है। दूसरी कुंजी शुरू होने तक Iterate। यह एडाप्टर में संलग्न हो सकता है मैंने – PiotrNycz

5

std::map<std::string, std::set<std::string>> के लिए exactamondo गुण आप के लिए (हालांकि अवर जटिलता unordered_map करने और unordered_set) देख रहे हैं प्रदर्शित होगी। (यह कुशल है जब वहाँ एक एकल कुंजी से जुड़ी मूल्यों की एक बड़ी संख्या है नहीं है, लेकिन मेरे मामले में प्रत्येक कुंजी पर बहुत कुछ मान देखते हैं

template<class K, class V> 
typename multimap<K, V>::const_iterator find_pair(const multimap<K, V>& map, const pair<K, V>& pair) 
{ 
    typedef multimap<K, V>::const_iterator it; 
    std::pair<it,it> range = map.equal_range(pair.first); 
    for (it p = range.first; p != range.second; ++p) 
     if (p->second == pair.second) 
      return p; 
    return map.end(); 
} 
template<class K, class V> 
bool insert_if_not_present(multimap<K, V>& map, const pair<K, V>& pair) 
{ 
    if (find_pair(map, pair) == map.end()) { 
     map.insert(pair); 
     return true; 
    } 
    return false; 
} 

:

+0

का उल्लेख किया है वह एक मल्टीमैप का उपयोग कर रहा है क्योंकि उसके पास एकाधिक कुंजी हैं। – Rapptz

+0

लेकिन ("ए", ("ए")) आपके निर्माण में अनुमति है ... – PiotrNycz

+0

मानचित्र और मल्टीमैप "एक" बहुत अनुमति देते हैं "एक",। DeadMG के सुझाव व्यावहारिक नहीं बल्कि मेरी स्थिति के लिए आदर्श है (ऊपर टिप्पणी देखें ... खासकर जब से मैं सी ++ 03 => अधिक चिंता पर हूँ प्रतिलिपि कंस्ट्रक्टर्स के बारे में।) – Qwertie