2010-01-22 12 views
15

मेरे पास एसटीएल मल्टीमैप है, मैं उस मानचित्र से प्रविष्टियों को हटाना चाहता हूं, जिसमें विशिष्ट मूल्य है, मैं पूरी कुंजी को हटाना नहीं चाहता, क्योंकि वह कुंजी अन्य मानों के लिए मैपिंग हो सकती है।एसटीएल मल्टीमैप मूल्यों को हटाएं/मिटाएं

कोई मदद कृपया।

+1

एक संभावित ठीक कुंजी और मूल्यों स्वैप करने के लिए हो सकता है:

तो तुम स्थानीय erase_iter चर शुरू करने की जरूरत के बिना थोड़ा अधिक सफाई से निकोला के जवाब पुनर्लेखन कर सकते हैं , यह सब पढ़ने के लिए यह विकल्प नहीं हो सकता है, लेकिन कुछ के लिए हो सकता है। – dangerousdave

उत्तर

14

यदि मैं सही ढंग से समझता हूं तो ये मान किसी भी कुंजी के अंतर्गत प्रदर्शित हो सकते हैं। यदि ऐसा है तो आपको अपने मल्टीमैप पर फिर से शुरू करना होगा और विशिष्ट मानों को मिटा देना होगा।

typedef std::multimap<std::string, int> Multimap; 
Multimap data; 

for (Multimap::iterator iter = data.begin(); iter != data.end();) 
{ 
    // you have to do this because iterators are invalidated 
    Multimap::iterator erase_iter = iter++; 

    // removes all even values 
    if (erase_iter->second % 2 == 0) 
     data.erase(erase_iter); 
} 
+0

हाँ आप सही हैं, मूल्य किसी भी कुंजी के तहत प्रकट हो सकते हैं। – Avinash

+0

धन्यवाद यह मेरे लिए काम करता है, मैं remove_if एल्गोरिदम का उपयोग करने के लिए देख रहा था। – Avinash

+0

मुझे डर है कि '' से 'remove_if'' केवल कंटेनरों के लिए काम करता है जहां '* it1 = * it2' कर रहे मूल्यों (वेक्टर, डेक, सूची - अंतिम के लिए उपोष्टतम को छोड़कर) को पुन: असाइन करना संभव है। यह मानचित्र के लिए संभव नहीं है, क्योंकि यह ऑर्डरिंग तोड़ सकता है। – UncleBens

1

के बाद से सी ++ 11, std::multimap::erase रिटर्न पिछले हटा तत्व निम्नलिखित पुनरावर्तक।

typedef std::multimap<std::string, int> Multimap; 
Multimap data; 

for (Multimap::iterator iter = data.begin(); iter != data.end();) 
{ 
    // removes all even values 
    if (iter->second % 2 == 0) 
     iter = data.erase(iter); 
    else 
     ++iter; 
} 

(भी this question को जवाब देखें)

संबंधित मुद्दे