2016-01-25 3 views
7

मैं बस निम्नलिखित कोड लिखा है, और बहुत आश्चर्य यह संकलन नहीं करता था:समर्थन रिवर्स इटरेटर्स को मिटाना क्यों नहीं है?

std::deque<int> container; 
// filling the container... 
for (auto it = container.rbegin(); it != container.rend(); ++it) 
    if (*it == 5) 
    { 
     container.erase(it); 
     break; 
    } 

आप देख सकते हैं, मैं, एक निश्चित मापदंड से मेल खाने पिछले तत्व हटाना चाहते हैं, यदि कोई हो।

त्रुटि

std :: Deque :: मिटा (std :: reverse_iterator करने के लिए कॉल के लिए कोई मिलता-जुलता समारोह ...

है पहले तो मुझे विश्वास नहीं था यह था । रिवर्स इटरेटर की वजह से है, लेकिन यह वास्तव में साथ begin/end यह हल करती है rbegin/rend की जगह के बाद से मामला है

तो, 2 सवाल:

  1. यह समर्थित क्यों नहीं है? क्या यह केवल उन छोटी सी चीजों में से एक है जो सी ++ कमेटी मानक में शामिल करना भूल गए हैं, या क्या इस अधिभार के लिए कोई औचित्य है?
  2. मुझे जो करना है वह करने का सबसे शानदार तरीका क्या है? क्या मैं इंडेक्स द्वारा पुन: प्रयास कर रहा हूं?
+4

मुझे लगता है कि आपका उत्तर यहां है: http://stackoverflow.com/questions/1830158/how-to-call-erase-with-a-reverse- इटेटर –

+0

'm_container' और' कंटेनर 'हैं, वही? – ZDF

+0

@ZDF: हाँ, ज़ाहिर है। –

उत्तर

1

मैं 'क्यों' प्रश्न पर उत्तर नहीं दे सकता, लेकिन 'कैसे' का जवाब देने के लिए - आपको अपने पुनरावर्तक पर base() पर कॉल करना चाहिए। यह एक उचित आगे इटेटरेटर वापस करने जा रहा है।

ऐसा करने के दौरान, रिवर्स और अग्रेषणकर्ताओं के बीच संबंधों को ध्यान में रखें। यह पहली बार भ्रमित हो सकता है, लेकिन वास्तव में काफी सरल है। यदि आप एक std::vector है निम्नलिखित मदों की युक्त हैं:

1, 2, 3, 4, 5 

और आप एक reverse_iterator rit, जो अपसंदर्भन पर आप 3 देता है, तो *(rit.base) क्यों देखने के लिए बस याद है कि सामान्य iterators begin() में 4. के बराबर हो जाएगा dereferencable है, लेकिन end() नहीं है। रिवर्स इटरेटर्स में, संपत्ति एक जैसी होनी चाहिए - rbegin() को डिफरेंसिबल होना चाहिए, लेकिन rend() नहीं होना चाहिए - यानी, कंटेनर की शुरुआत से परे इंगित करना चाहिए।

परिभाषा से के बाद से, rend.base()begin() रूप में ही है (क्योंकि उखड़ना reverse_iterator(begin()), एक ही रास्ता के सब से ऊपर धारण कर सकते हैं के रूप में निर्माण किया जा सकता, अगर rend.base() शुरुआत से परे एक के लिए एक अगली सही तत्व वापस आ जाएगी - begin() यह देखना आसान है कि समान समरूपता rend() के लिए रखती है।

+0

उत्तर को डाउनवॉटेड किया क्योंकि आप 'reverse_iterator :: base() 'को' er 'में आसानी से पास नहीं कर सकते एएस 'विधि। –

+0

@ व्हायोलेट जिराफ, क्यों? – SergeyA

+0

क्योंकि यह गलत तत्व मिटा देगा! इटरेटर को पहले 1 द्वारा समायोजित किया जाना चाहिए। –

संबंधित मुद्दे