एक एसटीएल कंटेनर से सभी तत्वों को हटाने का मूर्ख तरीका remove-erase idiom का उपयोग करना है।
static bool pred(const std::string &s) {
// ...
}
std::vector<std::string> v;
v.erase(std::remove_if(v.begin(), v.end(), pred), v.end());
आप सूचकांकों का उपयोग कर पर जोर देते हैं, तो आप सूचकांक को नहीं बढ़ाया जाना चाहिए: विचार, pred
और फिर कहते हैं कि विधेय ले जाने के लिए किसी दिए गए समारोह में (कि समारोह जो कुछ तत्व के लिए सही या गलत पैदावार है) है प्रत्येक तत्व के लिए, लेकिन केवल उन जो हटाया नहीं मिलता था के लिए:
std::vector<std::string>::size_type i = 0;
while (i < v.size()) {
if (shouldBeRemoved(v[i])) {
v.erase(v.begin() + i);
} else {
++i;
}
}
बहरहाल, यह न केवल अधिक कोड और कम मुहावरेदार है (पढ़ें: सी ++ प्रोग्रामर वास्तव में कोड को देखने के लिए, जबकि 'मिटा & है हटाएं 'मुहावरे तुरंत कुछ विचार देता है कि क्या हो रहा है), लेकिन बहुत कम कुशल क्योंकि वेक्टर स्टोर वें हैं स्मृति के एक संगत ब्लॉक में ईआईआर तत्व, इसलिए वेक्टर एंड के अलावा अन्य स्थितियों पर मिटाने से सेगमेंट के बाद सभी तत्वों को स्थानांतरित कर दिया जाता है।
स्रोत
2011-12-21 22:37:53
आप शायद 'remove_if' और' मिटा 'का उपयोग कर सकते हैं? http://en.wikipedia.org/wiki/Erase-remove_idiom – msandiford
मिटाएं मिटाएं: http://stackoverflow.com/questions/4175896/safe-way-to-continuously-erase-from-a-stdvector –