2012-03-06 15 views
26

से अंत यह काम करता है है सही (करता है कुछ भी नहीं है) जब मैं का उपयोगनिकाली जा रही है वेक्टर :: वेक्टर

vector<T> v; 
v.erase(v.end()); 

मैं की तरह

v.erase(std::find(...)); 

कुछ चाहिए मैं if यह v.end() है या नहीं का उपयोग करना चाहते हैं?
वहाँ C++.com और CPPreference

उत्तर

16

मानक इसे काफी स्पेल नहीं करता है, लेकिन 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 कार्रवाई।

+0

+1। –

+0

[डॉक्स] (http://www.cplusplus.com/reference/vector/vector/erase/) कहता है कि "वेक्टर एंड के अलावा अन्य स्थितियों में तत्वों को मिटाना कंटेनर को स्थानांतरित करने का कारण बनता है ..."। यह अंतराल() को पैरामीटर के रूप में उतारने जैसा दिखता है। और कहीं भी स्पष्ट रूप से विपरीत कहा। मुझे यह पसंद नहीं है ... – Pavel

+1

@ पावेल: तो आपको इसे "cplusplus.com" के लेखकों के साथ ले जाना होगा। यह * नहीं * सी ++ दस्तावेज है, मानक सी ++ दस्तावेज है। लेकिन यह 'स्थिति' को परिभाषित करता है "इटरेटर एक तत्व को इंगित करता है"। एक अंत इटरेटर एक तत्व को इंगित नहीं करता है। –

6

आप इस की कोशिश की है पर इसके बारे में कोई जानकारी है?

v.erase(remove_if(v.begin(), v.end(), (<your criteria>)), v.end()); 
+1

-1: एल्गोरिदम कंटेनरों से तत्वों को नहीं हटाते हैं। –

+0

अन्य सही उत्तरों की कमी से आपका उत्तर सही नहीं होता है। –

+4

मुझे नहीं पता कि यह क्यों डाउनवॉट किया गया है (शायद प्रारंभिक उत्तर के अलावा संपादित किया गया है)। कोड जो खड़ा है वह सही है। –

23

मिटाया जा रहा है end() (या उस बात के लिए, यहां तक ​​कि end() का लक्ष्य को देखकर) अपरिभाषित व्यवहार है। अपरिभाषित व्यवहार को आपके प्लेटफ़ॉर्म पर "बस काम" सहित कोई व्यवहार करने की अनुमति है। इसका मतलब यह नहीं है कि आपको यह करना चाहिए; यह अभी भी अपरिभाषित व्यवहार है, और जब आप कम से कम इसे बाद में उम्मीद कर रहे हैं तो मैं आपको सबसे बुरे तरीकों से काट दूंगा।

आप जो कर रहे हैं उसके आधार पर, आप यहां के बजाय set या unordered_set पर विचार करना चाहेंगे।

+0

धन्यवाद, मुझे पता है कि यूबी क्या है, मैं बस जानना चाहता था, क्या यह वास्तव में यूबी है। – RiaD

+0

@RiaD: हाँ, यह यूबी है। समाधान बहुत आसान है, हालांकि, मिटाने से पहले बस जांचें: '{auto it = v.find (x); अगर (यह! = x.end()) {v.erase (it); }} ' –

+0

आपके लिए प्रश्न @ बिली। जिज्ञासा से, अंत() - 1 काम करता है? यह pop_back() से अलग कैसे है? – Gaffi