2016-01-11 14 views
5

जानने के बिना, इटेटरेटर का उपयोग करके तत्व हटाएं, मेरे पास एक स्थिति है। मैंने अपने कार्य में से एक के लिए एक टेम्पलेट फ़ंक्शन का उपयोग किया है। इस समारोह में, मैं संदर्भ द्वारा इटरेटर पास करता हूं। अब, मुझे एक वेक्टर से कुछ तत्वों को हटाना होगा। मैं केवल iterators का उपयोग करके यह कैसे करूँ? Pl संबंधित कोड ढूंढें:वेक्टर

template <class BidirectionalIterator, class Iterator> bool 

SomeFunc(BidirectionalIterator& first, BidirectionalIterator& last, Iterator anotherVecBegin) 
{ 
    while((first+1) != last) 
    { 
     if(some_condition) 
      // delete (first); HOW? 
     else if(some_other_condition) 
      // delete (first + 1); HOW? 
    } 

    // add something to another vector using anotherVecBegin 

    return true; 
} 

कई पहले से ही पूछे जाने वाले प्रश्न हैं, लेकिन उनके पास सभी संदर्भ में वेक्टर हैं। इसलिए myVec.erase(*first) आसान है ..

मुझे यह भी पता है कि यह एक बहुत अच्छा तरीका नहीं है कि मैं संदर्भ द्वारा इसे इटरेटर भेजता हूं। लेकिन मैं सरल नियमों का पालन कर रहा हूं: जब कुछ बदलने की उम्मीद है या भारी प्रतिलिपि से बचने के लिए संदर्भों का उपयोग करें। मेरा परिदृश्य पहली स्थिति फिट कर रहा है।

तो मैं कैसे हटा सकता हूं?

उत्तर

6

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

+1

देखें ['std :: मिटाएं (std :: remove_if()) 'idiom] (http://en.cppreference.com/w/cpp/ एल्गोरिदम/हटाएं) – YSC

+1

@YSC मुझे नहीं लगता कि वहां 'std :: erase' है। बिंदु यह है कि आपको 'std :: vector :: erase' पर कॉल करने के लिए 'std :: vector' उदाहरण की आवश्यकता है। – juanchopanza

+0

@juanchopanza यहां नहीं है। हालांकि मैं संपादित नहीं कर सकता। सोमवार सुबह टाइपो। – YSC

2

आप नहीं कर सकते। एक कंटेनर से तत्व को हटाने से सभी इटरेटर्स को अमान्य कर दिया जाएगा, इसलिए आपको प्रत्येक विलोपन के बाद first और last अपडेट करना होगा।

+0

_ "किसी कंटेनर से तत्व को हटाने से सभी इटरेटर्स को अमान्य कर दिया जाएगा" _ - यह गलत है। विभिन्न कंटेनर में एरर के लिए अलग इटरेटर अमान्यता नियम हैं। उदाहरण के लिए देखें http://stackoverflow.com/a/6442829/6345 –

2
  1. स्टैंडर्ड पुस्तकालय: आप कंटेनर का संदर्भ मिलता है चाहिए, या एक जगह तुम्हारे पास है, जहां के लिए विलोपन स्थगित। इसके आसपास कोई रास्ता नहीं है। तत्वों को जोड़ने या निकालने के लिए कंटेनर की आवश्यकता होती है और कंटेनर को इटरेटर से ढूंढने का कोई तरीका नहीं है।

    इसके अतिरिक्त, यह मत भूलना कि एक वेक्टर से मिटाने से वेक्टर को सभी वेरिएटर को अमान्य कर दिया जाता है।

  2. अन्य पुस्तकालयों: Boost.Intrusive कुछ कंटेनर है कि आप वस्तु (जो इटरेटर के रूप में दोगुना हो जाता है) करने के लिए सिर्फ एक सूचक के साथ कुछ भी ऐसा करने की अनुमति है, लेकिन वे जुड़े हुए सूचियों, जो आम तौर पर सबसे प्रयोजनों के लिए वैक्टर की तुलना में कम कुशल हैं कर रहे हैं।