दिलचस्प पोस्ट
कोको ग्राफिंग / प्लॉटिंग फ्रेमवर्क जो आईफोनओएस पर काम करता है जावा क्लास के इंटरफेस को क्यों पसंद किया जाना चाहिए? स्क्रिप्ट से स्थापित पैकेज आयात करना "AttributeError: मॉड्यूल में कोई विशेषता नहीं है" या "ImportError: नाम आयात नहीं किया जा सकता" स्थिर ऑब्जेक्ट फ़ील्ड का मान सेट नहीं किया जा सकता (त्रुटि LNK2001: अनसुलझा बाहरी प्रतीक) आप आर में "<< -" (स्क्रॉपिंग असाइनमेंट) का उपयोग कैसे करते हैं? मैं अपने खुद के कोड में Google क्रोम 11 की अपलोड फ़ोल्डर सुविधा का उपयोग कैसे करूं? ASP.NET में उपयोगकर्ता के क्लाइंट आईपी पते को कैसे प्राप्त करें? NSLog के साथ आईओएस 8 एक्सटेंशन डिबग कैसे करें? मैं शॉर्टहैंड का उपयोग कैसे करूँ / अगर अन्य? निष्पादक सेवा, समाप्त करने के लिए सभी कार्यों का इंतजार कैसे करें जावा थ्रेड में मैं एक पैरामीटर कैसे पास कर सकता हूं? प्रवेश-नियंत्रण-अनुमति-उत्पत्ति त्रुटि Google एपीआई के लिए एक jQuery पोस्ट भेज रहा है PYTHONPATH पर स्थायी रूप से एक निर्देशिका जोड़ें <में अंतर क्या है <? सुपर ई> और <? ई विस्तारित? भारतीय नंबरिंग प्रारूप में मुद्रा प्रदर्शित

एक रिवर्स आईटरेटर के साथ मिटाने के लिए कैसे करें

मैं ऐसा कुछ करने की कोशिश कर रहा हूं:

for ( std::list< Cursor::Enum >::reverse_iterator i = m_CursorStack.rbegin(); i != m_CursorStack.rend(); ++i ) { if ( *i == pCursor ) { m_CursorStack.erase( i ); break; } } 

हालांकि मिटा एक इटरेटर लेता है और एक रिवर्स इटरेटर नहीं। क्या कोई रिवर्स आईटरेटर को एक नियमित इटरेटर में परिवर्तित करने का तरीका या सूची से इस तत्व को निकालने का एक अन्य तरीका है?

वेब के समाधान से एकत्रित समाधान "एक रिवर्स आईटरेटर के साथ मिटाने के लिए कैसे करें"

कुछ और शोध और परीक्षण के बाद मुझे समाधान मिला स्पष्ट रूप से मानक के अनुसार [24.4.1 / 1] i.base () और i के बीच के रिश्ते:

 &*(reverse_iterator(i)) == &*(i - 1) 

( डॉ। डॉब्स लेख से ):

वैकल्पिक शब्द

इसलिए आपको आधार मिलने पर एक ऑफ़सेट लागू करना होगा ()। इसलिए समाधान है:

 m_CursorStack.erase( --(i.base()) ); 

संपादित करें

सी ++ 11 के लिए अद्यतन

रिवर्स_इटरेटर i अपरिवर्तित है:

 m_CursorStack.erase( std::next(i).base() ); 

रिवर्स_इटरेटर i उन्नत है:

 std::advance(i, 1); m_CursorStack.erase( i.base() ); 

मुझे अपने पिछले समाधान से यह बहुत स्पष्ट लगता है जो भी आप की आवश्यकता होती है उसका उपयोग करें

कृपया ध्यान दें कि m_CursorStack.erase( (++i).base()) एक समस्या हो सकती है यदि लूप में (मूल प्रश्न देखें) क्योंकि यह i का मान बदलता है। सही अभिव्यक्ति है m_CursorStack.erase((i+1).base())

… या सूची से इस तत्व को निकालने का एक और तरीका है?

इसके लिए -std=c++11 ध्वज ( auto ) की आवश्यकता है:

 auto it=vt.end(); while (it>vt.begin()) { it--; if (*it == pCursor) //{ delete *it; it = vt.erase(it); //} } 

reverse_iterator के base() विधि का इस्तेमाल करते हुए और परिणाम यहां कम करने के लिए, यह ध्यान देने योग्य है कि reverse_iterator को नियमित iterator रूप में समान स्थिति नहीं दी गई है। सामान्यतया, आपको const_iterator एस (साथ ही साथ const_iterator एस और const_reverse_iteratorconst_reverse_iterator एस) के लिए नियमित iterator को पसंद करना चाहिए, इस तरह के सटीक कारणों के लिए। क्यों डॉक्टर डब्ब्स जर्नल को गहन चर्चा के लिए देखें

 typedef std::map<size_t, some_class*> TMap; TMap Map; ....... for( TMap::const_reverse_iterator It = Map.rbegin(), end = Map.rend(); It != end; It++ ) { TMap::const_iterator Obsolete = It.base(); // conversion into const_iterator It++; Map.erase( Obsolete ); It--; } 

यदि आप के पास जाने के साथ-साथ हर चीज को मिटाने की आवश्यकता नहीं है, तो समस्या को हल करने के लिए, आप मिटाना-हटाना मुहावरे का उपयोग कर सकते हैं:

 m_CursorStack.erase(std::remove(m_CursorStack.begin(), m_CursorStack.end(), pCursor), m_CursorStack.end()); 

std::remove कंटेनर में सभी आइटम std::remove स्वैप करता है जो pCursor को समाप्त करने के लिए मेल खाता है, और पहले मिलान आइटम पर एक pCursor देता है। फिर, किसी श्रेणी का उपयोग करके मिटा दें, पहले मैच से मिट जाएगा और अंत में जाएंगे। गैर-मिलान वाले तत्वों का क्रम संरक्षित है।

यह आपके लिए तेज काम कर सकता है यदि आप std::vector का उपयोग कर रहे हैं, जहां सामग्री के बीच में मिटाने में बहुत सारी नकल या चलती हो सकती है

या बेशक, reverse_iterator::base() के उपयोग के बारे में बताए गए उत्तरों में दिलचस्प और लायक जानने के लिए, सटीक समस्या को हल करने के लिए, मैं तर्क करता हूं कि std::remove एक बेहतर फिट है

बस कुछ स्पष्ट करना चाहता था: उपरोक्त टिप्पणियों में और मिटा देने के लिए पोर्टेबल संस्करण का जवाब (++ i) के रूप में उल्लिखित है .बेस () हालांकि जब तक मुझे कुछ याद नहीं आ रहा है, सही वक्तव्य (++ आरआई) है .बेस (), जिसका मतलब है कि आप रिवर्स_आईटरेटर (इटरेटर नहीं) को बढ़ाते हैं।

मैं कल की तरह कुछ करने की आवश्यकता में भाग गया और यह पोस्ट सहायक था। सबको धन्यवाद।