2012-02-06 10 views
38

पाया जाता है शायद यह एक नकली है, लेकिन मैं कुछ भी खोज नहीं मिला: erase(value)std::multiset पर कहा जाता है जब सभी मिले मान वाले तत्व हटा दिए जाते हैं। एकमात्र समाधान जो मैं सोच सकता था वह है:std :: मल्टीसेट में वहाँ है एक समारोह या एल्गोरिथ्म सिर्फ एक नमूना मिटा (unicate या डुप्लिकेट) के लिए अगर एक तत्व

std::multiset<int>::iterator hit(mySet.find(5)); 
if (hit!= mySet.end()) mySet.erase(hit); 

यह ठीक है लेकिन मैंने सोचा कि बेहतर हो सकता है। कोई विचार ?

+12

ग में एक मल्टीसेट में एक उदाहरण दूर करने के लिए यह एक पूरी तरह से उचित दृष्टिकोण है के बारे में सोच सकते हैं। – templatetypedef

+0

क्या यह दृष्टिकोण सुनिश्चित करता है कि दी गई कुंजी ("5") डुप्लिकेट है? – Arun

+0

@ अरुणसाहा: नहीं, लेकिन अगर यह डुप्लिकेट नहीं है, तो मैं इसे किसी भी तरह से हटाना चाहता हूं। मुझे मिली उत्तरों से, मुझे यह महसूस हो रहा है कि कोई बेहतर समाधान नहीं है। शायद सवाल पहली जगह बेवकूफ था :-P – Martin

उत्तर

2

मैं निम्नलिखित का प्रयास करूंगा।

कुंजी के बराबर तत्वों की श्रेणी को खोजने के लिए पहले equal_range() पर कॉल करें।

लौटे रेंज गैर खाली, तत्वों की एक सीमा (यानी erase() जो दो iterators लेता है) जहां है तो erase():

  • पहला तर्क लौटे में 2 तत्व को इटरेटर है रेंज (यानी एक अतीत .first लौटे) और

  • लौटे रेंज जोड़ी इटरेटर के .second एक के रूप में दूसरा तर्क। पढ़ने templatetypedef के बाद


संपादित करें टिप्पणी (धन्यवाद!):

एक (के रूप में सभी के लिए विरोध) में दोहरे हटा दिया जाना माना जाता है, तो: जोड़ी equal_range() द्वारा लौटाए गए कम से कम है, तो दो तत्वों, तो erase()erase() के एकल इटरेटर संस्करण के लिए वापस आ जोड़ी के प्रथम पारित करके पहला तत्व:

छद्म कोड:

pair<iterator, iterator> pit = mymultiset.equal_range(key); 

if(distance(pit.first, pit.second) >= 2) { 
    mymultiset.erase(pit.first); 
} 
+2

मुझे लगता है कि सवाल सिर्फ एक डुप्लिकेट को खत्म करने के बारे में पूछ रहा है, सभी डुप्लिकेट नहीं। – templatetypedef

+0

क्या यह पता है कि यह मेरे समाधान से तेज़ है और यदि हां क्यों? – Martin

-3

वास्तव में, सही जवाब है:

my_multiset.erase (my_multiset.find (मान));

+0

कृपया बताएं कि यह सही उत्तर क्यों है। –

+1

यदि मल्टीसेट में _value_ मौजूद नहीं है, तो यह _undefined behaviour_ का कारण बनता है। –

1
multiset <int> :: iterator it , it1 ; 
it = myset.find (value) ; 
it1 = it ; 
it1 ++ ; 
myset.erase (it , it1) ; 
9
auto itr = my_multiset.find(value) 
if(itr!=my_multiset.end()){ 
    my_multiset.erase(itr); 
} 

मैं कल्पना कर सकते हैं वहाँ एक ही पूरा करने की एक क्लीनर तरीका है। लेकिन यह काम पूरा हो जाता है।

1
if(my_multiset.find(key)!=my_multiset.end()) 
    my_multiset.erase(my_multiset.equal_range(key).first); 

यह सबसे अच्छा तरीका है मैं ++

+1

समाधान के मुकाबले मैंने प्रश्न में प्रस्तावित किया है कि आपका कोड दो खोजों (खोजने के लिए + बराबर_रेंज) करता है जो अक्षम है – Martin