दिलचस्प पोस्ट
मान्य प्लगइन jquery का उपयोग करके इनपुट की सरणी कैसे मान्य करें टंकिनर जीयूआई के लिए कमांड लाइन परिणाम पुनर्निदेशित करें क्या एक टीसीपी सॉकेट कनेक्शन में "जीवित रहना" है? VBA कोड का उपयोग Excel 2003 में छवि के रूप में एक्सेल कार्यपत्रकों को कैसे निर्यात करें? उपयोगकर्ता के लिए जावा जेडीबीसी एक्सेस निषेध स्क्रीन ओरियनेशन लॉक सी में एक समारोह के अंदर स्थिर चर अंदर जावास्क्रिप्ट में बहुभाषी स्ट्रिंग बनाना सी / सी ++: फोर्स बिट फील्ड ऑर्डर और संरेखण UITableViewCell से UITableView कैसे प्राप्त करें? एक संदर्भित कम फ़ाइल सीएसएस में PHP के साथ स्वचालित रूप से संकलित करें जेएसन के साथ रेल तिथियां मेवेन 3 बिल्डिंग के बारे में चेतावनी। Plugins.plugin.version क्या किसी विदेशी कुंजी के साथ तालिका स्तंभ निरर्थक हो सकते हैं? UITextBorderStyleNone के साथ UITextField के लिए पैडिंग सेट करें

मैं एक निश्चित मूल्य के साथ एक स्टाइल वेक्टर से एक आइटम कैसे निकालूं?

मैं एसटीएल वेक्टर के लिए एपीआई दस्तावेज को देख रहा था, और देखा कि वेक्टर वर्ग पर कोई तरीका नहीं था, जिसने एक निश्चित मूल्य के साथ एक तत्व को हटाने की अनुमति दी। यह एक सामान्य ऑपरेशन की तरह लगता है, और यह अजीब लगता है कि ऐसा करने के लिए कोई भी निर्माण नहीं हुआ है।

वेब के समाधान से एकत्रित समाधान "मैं एक निश्चित मूल्य के साथ एक स्टाइल वेक्टर से एक आइटम कैसे निकालूं?"

std :: remove वास्तव में कंटेनर से तत्व को मिट नहीं करता है, लेकिन यह नए एंड इटरेटर को वापस करता है जो कंटेनर टाइप करने के लिए पारित किया जा सकता है :: अतिरिक्त तत्वों का असली हटाना जो अब कंटेनर के अंत में हैं :

std::vector<int> vec; // .. put in some values .. int int_to_remove = n; vec.erase(std::remove(vec.begin(), vec.end(), int_to_remove), vec.end()); 

यदि आप किसी आइटम को हटाना चाहते हैं, तो निम्नलिखित में थोड़ा अधिक कुशल होगा।

 std::vector<int> v; auto it = std::find(v.begin(), v.end(), 5); if(it != v.end()) v.erase(it); 

या आप वस्तुओं को ले जाने के ऊपरी भाग से बच सकते हैं यदि आदेश आपको कोई फर्क नहीं पड़ता:

 std::vector<int> v; auto it = std::find(v.begin(), v.end(), 5); if (it != v.end()) { using std::swap; // swap the one to be removed with the last element // and remove the item at the end of the container // to prevent moving all items after '5' by one swap(*it, v.back()); v.pop_back(); } 

वैश्विक विधि std :: को शुरू और अंत iterator के साथ हटा दें का उपयोग करें, और फिर तत्वों को वास्तव में निकालने के लिए std :: vector.erase का उपयोग करें।

प्रलेखन लिंक
std :: remove http://www.cppreference.com/cppalgorithm/remove.html
std :: vector.erase http://www.cppreference.com/cppvector/erase.html

 std::vector<int> v; v.push_back(1); v.push_back(2); //Vector should contain the elements 1, 2 //Find new end iterator std::vector<int>::iterator newEnd = std::remove(v.begin(), v.end(), 1); //Erase the "removed" elements. v.erase(newEnd, v.end()); //Vector should now only contain 2 

मेरी बकवास की ओर इशारा करते हुए जिम बक के लिए धन्यवाद

यदि आपके पास एक निरर्थक सदिश है, तो आप बस पिछले सदिश तत्व से स्वैप कर सकते हैं फिर resize()

एक आदेश दिया कंटेनर के साथ, आप std std::vector::erase() साथ सबसे अच्छा हो जाएगा। ध्यान दें कि <algorithm> में एक std::remove() परिभाषित है, लेकिन यह वास्तव में मिटा नहीं रहा है (सावधानी से दस्तावेज पढ़ें)।

अन्य जवाब यह कैसे अच्छी तरह से करते हैं, लेकिन मैंने सोचा कि मैं यह भी कहना चाहूंगा कि यह वास्तव में अजीब नहीं है कि यह वेक्टर एपीआई में नहीं है: यह वेक्टर के माध्यम से मूल्य के लिए अकुशल, रैखिक खोज है, एक गुच्छा कॉपी करने के लिए इसे हटाने के लिए

यदि आप इस ऑपरेशन को तीव्रता से कर रहे हैं, तो इस कारण के लिए std :: सेट पर विचार करने में लायक हो सकता है

यह भी देखें std :: remove_if एक predicate का उपयोग करने में सक्षम होने के लिए …

ऊपर दिए गए लिंक से यहां का उदाहरण दिया गया है:

 vector<int> V; V.push_back(1); V.push_back(4); V.push_back(2); V.push_back(8); V.push_back(5); V.push_back(7); copy(V.begin(), V.end(), ostream_iterator<int>(cout, " ")); // The output is "1 4 2 8 5 7" vector<int>::iterator new_end = remove_if(V.begin(), V.end(), compose1(bind2nd(equal_to<int>(), 0), bind2nd(modulus<int>(), 2))); V.erase(new_end, V.end()); [1] copy(V.begin(), V.end(), ostream_iterator<int>(cout, " ")); // The output is "1 5 7". 

एक छोटा समाधान (जो आपको सदिश नाम को 4 बार दोहराने के लिए बाध्य नहीं करता) बूस्ट का उपयोग करना होगा:

 #include <boost/range/algorithm_ext/erase.hpp> // ... boost::remove_erase(vec, int_to_remove); 

http://www.boost.org/doc/libs/1_64_0/libs/range/doc/html/range/reference/algorithms/new/remove_erase.html देखें

यदि आप इसे बिना किसी अतिरिक्त के लिए करना चाहते हैं:

 vector<IComponent*> myComponents; //assume it has items in it already. void RemoveComponent(IComponent* componentToRemove) { IComponent* juggler; if (componentToRemove != NULL) { for (int currComponentIndex = 0; currComponentIndex < myComponents.size(); currComponentIndex++) { if (componentToRemove == myComponents[currComponentIndex]) { //Since we don't care about order, swap with the last element, then delete it. juggler = myComponents[currComponentIndex]; myComponents[currComponentIndex] = myComponents[myComponents.size() - 1]; myComponents[myComponents.size() - 1] = juggler; //Remove it from memory and let the vector know too. myComponents.pop_back(); delete juggler; } } } }