मानक इसे काफी स्पेल नहीं करता है, लेकिन v.erase(q)
परिभाषित किया गया है, " में q
द्वारा इंगित तत्व को मिटा देता है"। इसका मतलब है कि q
वास्तव में एक तत्व को इंगित करना चाहिए, जो अंत इटरेटर नहीं करता है। अंत इटरेटर में गुजरना अपरिभाषित व्यवहार है। इसलिए सभी कंटेनर आप की जरूरत के लिए इस टेम्पलेट के सामान्यीकरण के
template typename<Sequence, Iterator>
Iterator my_erase(Sequence &s, Iterator it) {
if (it == s.end()) return it;
return s.erase(it);
}
my_erase(v, std::find(v.begin(), v.end(), whatever));
c.erase()
एक साहचर्य कंटेनर रिटर्न void
पर,:
दुर्भाग्य से, आप लिखने की ज़रूरत:
auto it = std::find(...);
if (it != <the part of ... that specifies the end of the range searched>) {
v.erase(it);
}
बेशक
, आप निर्धारित कर सकते हैं कुछ -> decltype
कार्रवाई।
स्रोत
2012-03-06 19:11:47
+1। –
[डॉक्स] (http://www.cplusplus.com/reference/vector/vector/erase/) कहता है कि "वेक्टर एंड के अलावा अन्य स्थितियों में तत्वों को मिटाना कंटेनर को स्थानांतरित करने का कारण बनता है ..."। यह अंतराल() को पैरामीटर के रूप में उतारने जैसा दिखता है। और कहीं भी स्पष्ट रूप से विपरीत कहा। मुझे यह पसंद नहीं है ... – Pavel
@ पावेल: तो आपको इसे "cplusplus.com" के लेखकों के साथ ले जाना होगा। यह * नहीं * सी ++ दस्तावेज है, मानक सी ++ दस्तावेज है। लेकिन यह 'स्थिति' को परिभाषित करता है "इटरेटर एक तत्व को इंगित करता है"। एक अंत इटरेटर एक तत्व को इंगित नहीं करता है। –