2011-03-07 14 views
5

के अंतिम तत्व को क्यों हटा नहीं सकता हूं मेरे पास कई तत्वों से युक्त एसएलएल वेक्टर हैं। मुझे इस वेक्टर के माध्यम से पुन: प्रयास करने की आवश्यकता है और कुछ मानदंडों को पूरा करने वाले तत्वों को हटा दें। तो मैं इस कोडमैं वेक्टर

इस कोड को लगभग सभी मामलों के लिए ठीक काम करता है लिखा है, वेक्टर के सभी तत्वों को पूरा करती है लेकिन यदि मापदंड मैं एक त्रुटि मिलती है: अगर मैं केवल एक है

vector erase iterator outside the range 

यह त्रुटि आती है वेक्टर में तत्व छोड़ दिया। मुझसे क्या गलती हुई है ?

उत्तर

11
if(imageDataVector[i] < threshold) 
     imageDataVector.erase(imageDataVector.end()-j); 

संभावना होना चाहिए:

if(imageDataVector[j] < threshold) 
     imageDataVector.erase(imageDataVector.begin()+j); 

संपादित करें:

imageDataVector.erase(std::remove_if(imageDataVector.begin(), imageDataVector.end(), std::bind2nd(std::less<vector_data_type>(), threshold)), imageDataVector.end()); 

vector<type>::iterator it = imageDataVector.begin(); 
while (it != imageDataVector.end()) { 
    if (*it < threshold) 
    it = imageDataVector.erase(it); 
    else 
    ++it; 
} 
+0

ई हाँ, मेरा बुरा। अब यह ठीक काम करता है :) – igor

+2

+1, यह ध्यान रखना महत्वपूर्ण है कि * अच्छा * तरीका * मिटाना-निकालना * मुहावरे है, क्योंकि यह दूसरों की तुलना में अधिक कुशल है (विशेष रूप से, सबसे बुरे मामले में जहां सभी तत्व मिलते हैं मानदंड, * मिटाएं-निकालें * रैखिक * ओ (एन) * है, जबकि अन्य दो संस्करणों में वर्गबद्ध प्रदर्शन * ओ (एन^2) * –

6

आप आगे मिश्रण कर रहे हैं और पिछड़े अनुक्रमण: पूर्णता, मिटा-निकालें रास्ता और इटरेटर रास्ता के लिए।

मैं इसके बजाय std::remove_if का उपयोग करने पर विचार करता हूं। इस तरह यदि आप कई तत्वों को हटा रहे हैं तो आप प्रत्येक मिटावट पर पूरे वेक्टर को आगे नहीं बदलते हैं।

वह कुछ इस तरह दिखेगा:

imageDataVector.erase(std::remove_if(imageDataVector.begin(), imageDataVector.end(), std::bind2nd(std::less<data_type>(), threshold)), imageDataVector.end()); 

वैकल्पिक रूप से ध्यान देने योग्य बात यह है कि यह आंदोलन का एक बहुत में परिणाम होगा यदि आप वेक्टर से कई आइटम को हटाने, निम्नलिखित का प्रयास करें।

for (int j=imageDataVector.size()-1 ;j>=0;j--) 
{ 
    if(imageDataVector[i] < threshold) 
     imageDataVector.erase(imageDataVector.begin()+j); 
} 
+0

क्या कुछ और के साथ std :: less <>() को पुनर्स्थापित करना संभव है फैंसी फ़ंक्शन ?? सीएच में तुलनित्र की तरह एसएच ?? – igor

+0

@igor आप इसे किसी भी पैरामीटर के साथ प्रतिस्थापित कर सकते हैं और आइटम को हटाए जाने पर सत्य लौटा सकता है। –

3

आप शून्य करने के लिए जे उलटी गिनती करने की कोशिश कर रहे हैं, और imageDataVector.end() - 0 एक वैध इटरेटर नहीं है। मानक सी ++ लाइब्रेरी कंटेनर में, एंड इटेटरेटर अंतिम तत्व से पहले एक बिंदु को इंगित करता है, न कि अंतिम तत्व पर।