2009-03-14 21 views
5

उदाहरण के लिए यदि आपके पास std::vector<MyClass> है, जहां MyClass में सार्वजनिक विधि है: bool isTiredOfLife(), आप उन तत्वों को कैसे हटाते हैं जो सत्य लौटते हैं?तत्वों की कुछ संपत्ति के आधार पर आप std :: वेक्टर के तत्वों को कैसे हटाएंगे?

उत्तर

21

मैं पसंद remove_if

v.erase(remove_if(v.begin(), v.end(), 
       mem_fun_ref(&MyClass::isTiredOfLife)), 
     v.end()); 

remove_if पिछले तत्व अनुक्रम में अभी भी उस के बाद एक इटरेटर इशारा देता है। erase अपने पहले से अंतिम तर्क (दोनों iterators) से सबकुछ मिटा देता है।

+1

मैं remove_if बारे में भूल गया() +1 । –

+0

बहुत अच्छा। पहले कभी नहीं देखा। +1 – Bernard

+0

धन्यवाद, यह चाल है। –

6

remove_if का उपयोग करना ऐसा करने का "सही" तरीका है। सतर्क रहें और मिटाने के लिए एक इटरेटर का उपयोग न करें, क्योंकि आइटम को हटाने से इटरेटर को अमान्य कर दिया जाता है। असल में, मिसास() को प्राथमिक विधि के रूप में उपयोग करने वाला कोई भी उदाहरण वैक्टरों पर एक बुरा विचार है, क्योंकि मिटाएं ओ (एन) है, जो आपके एल्गोरिदम ओ (एन^2) को बनाएगा। यह एक ओ (एन) एल्गोरिदम होना चाहिए।

नीचे दी गई विधि remove_if की तुलना में तेज़ी से होने की संभावना है, लेकिन remove_if के विपरीत, तत्वों के सापेक्ष क्रम को संरक्षित नहीं करेगा। यदि आप आदेश बनाए रखने की परवाह करते हैं (यानी आपका वेक्टर सॉर्ट किया गया है), उपरोक्त उत्तर में, remove_if का उपयोग करें। आप के बारे में परवाह नहीं करते हैं, और आइटम हटाए जाने के लिए की संख्या आम तौर पर वेक्टर के एक चौथाई से भी कम है, तो, इस विधि तेजी से होने की संभावना है:

for(size_t i = 0; i < vec.size();) 
    if(vec[i].isTiredOfLife()) 
    { 
     vec[i] = vec.back(); 
     vec.pop_back(); 
    } 
    else 
     ++i; 
+0

डी ओह। मैं उसके बारे में भूल गया। यह लिंक किए गए पेज में भी बोल्ड में है। : o मैंने अपनी पोस्ट हटा दी है, इसलिए कोई भी इसका उपयोग नहीं करता है। – Bernard

+0

क्या यह वेक्टर में तत्वों को पुनर्व्यवस्थित नहीं करेगा? मान लीजिए कि, उदाहरण के लिए, इनपुट वेक्टर सॉर्ट किया गया है, आउटपुट वेक्टर नहीं होगा, अंतिम तत्व पहले हटाए गए तत्व की स्थिति लेगा। –

+0

आप बर्नार्ड के संदर्भ में संदर्भित करने के लिए अपना उत्तर अपडेट करना चाहेंगे। –

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