उदाहरण के लिए यदि आपके पास std::vector<MyClass>
है, जहां MyClass
में सार्वजनिक विधि है: bool isTiredOfLife()
, आप उन तत्वों को कैसे हटाते हैं जो सत्य लौटते हैं?तत्वों की कुछ संपत्ति के आधार पर आप std :: वेक्टर के तत्वों को कैसे हटाएंगे?
उत्तर
मैं पसंद remove_if
v.erase(remove_if(v.begin(), v.end(),
mem_fun_ref(&MyClass::isTiredOfLife)),
v.end());
remove_if
पिछले तत्व अनुक्रम में अभी भी उस के बाद एक इटरेटर इशारा देता है। erase
अपने पहले से अंतिम तर्क (दोनों iterators) से सबकुछ मिटा देता है।
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;
डी ओह। मैं उसके बारे में भूल गया। यह लिंक किए गए पेज में भी बोल्ड में है। : o मैंने अपनी पोस्ट हटा दी है, इसलिए कोई भी इसका उपयोग नहीं करता है। – Bernard
क्या यह वेक्टर में तत्वों को पुनर्व्यवस्थित नहीं करेगा? मान लीजिए कि, उदाहरण के लिए, इनपुट वेक्टर सॉर्ट किया गया है, आउटपुट वेक्टर नहीं होगा, अंतिम तत्व पहले हटाए गए तत्व की स्थिति लेगा। –
आप बर्नार्ड के संदर्भ में संदर्भित करने के लिए अपना उत्तर अपडेट करना चाहेंगे। –
- 1. std :: वेक्टर तत्वों में कॉन्स संदर्भ
- 2. क्या वेक्टर तत्वों को चलने की आवश्यकता है?
- 3. जावा Xstream - कुछ तत्वों की अनदेखी कैसे
- 4. rel मूल्य के आधार पर सभी HTML तत्वों का चयन
- 5. (परहेज छोरों) एक ही वेक्टर के आसन्न तत्वों की तुलना
- 6. तत्वों को निकालने के लिए कैसे
- 7. कुछ तत्वों के XML नेमस्पेस को कैसे बदलें
- 8. कुछ तत्वों के अनुसार सॉर्टिंग सूचियां
- 9. संपत्ति के आधार पर दो सूचियों को मर्ज कैसे करें?
- 10. std-containers (C++) में तत्वों के सभी जोड़े पर इटरेटिंग
- 11. कुछ तत्वों पर Cufon को अक्षम कैसे करें?
- 12. कुछ नेस्टेड तत्वों के साथ फ्रीमार्कर मैक्रोज़
- 13. तत्वों के क्रम को बदलना
- 14. आर: डेटा.फ्रेम के तत्वों को कैसे बदलें?
- 15. स्ट्रिंग्स के वेक्टर से खाली तत्वों को हटाकर
- 16. कुछ तत्वों के साथ शुरू होने वाले सभी तत्वों को कैसे प्राप्त करें?
- 17. std :: vector के तत्वों को डिफ़ॉल्ट कन्स्ट्रक्टर की आवश्यकता क्यों नहीं है?
- 18. सरणी के तत्वों को कैसे निकालें?
- 19. टेबल-सेल के शीर्ष पर कुछ तत्वों को कैसे नीचे रखें और कुछ नीचे?
- 20. अवहेलना toString, जैसा कि आप जानते तत्वों
- 21. std :: सूची बनाम std :: वेक्टर पुनरावृत्ति
- 22. बढ़ावा से तत्वों को मिटाने के लिए कैसे करें :: ptr_vector
- 23. std :: वेक्टर डालने() reallocation
- 24. तत्वों की ऊंचाई और चौड़ाई के आधार पर एक्स और वाई प्रतिशत मानों का अनुवाद करें?
- 25. स्ट्रिंग वर्ण के आधार पर वेक्टर को कैसे सब्सक्राइब करें?
- 26. jQuery में, मैं कुछ वर्गों वाले तत्वों के बीच तत्वों का चयन कैसे करूं?
- 27. तत्वों को अक्षम (और पुन: सक्षम करें) तत्वों पर क्लिक करें और तत्वों पर क्लिक करें
- 28. मैं ऐरे के तत्वों को कैसे निकालूं?
- 29. तत्वों को
- 30. कुछ मानदंडों से सरणी तत्वों को नष्ट
मैं remove_if बारे में भूल गया() +1 । –
बहुत अच्छा। पहले कभी नहीं देखा। +1 – Bernard
धन्यवाद, यह चाल है। –