दिलचस्प पोस्ट
यह जावास्क्रिप्ट "आवश्यकता" क्या है? सी # में "के साथ … अंत के साथ" समानता? R: RCurl के साथ स्क्रैप किए गए वेब पेज से "क्लीन" यूटीएफ -8 पाठ निकालने के लिए मेरे प्रोग्राम मेमोरी को कभी रिलीज़ नहीं करता क्यूं कर? मैं विज़ुअल स्टूडियो 2008 में अपने आवेदन के लिए आइकन कैसे सेट करूं? sed कमांड के साथ -i विकल्प मैक पर असफल हो रहा है, लेकिन लिनक्स पर काम करता है Json मेरे angular.js एनजी मॉडल में लोड करने के लिए कैसे? एक EventEmitter का उचित उपयोग क्या है? एक SqlCommand ऑब्जेक्ट से उत्पन्न एसक्यूएल कथन प्राप्त करें? प्रत्येक WCF कॉल में कस्टम HTTP हैडर को कैसे जोड़ें? वरीयताओं के लिए एक कस्टम लेआउट बनाना किसी UI के बिना गतिविधि कैसे लॉन्च की जाए? वैकल्पिक पैरामीटर के डिफ़ॉल्ट मान के रूप में खाली सरणी उत्तीर्ण करना वास्तव में एक पुनरावृत्ति समारोह क्या है? setTimeout / स्पष्ट टाइमआउट समस्याओं

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

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

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

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

Solutions Collecting From Web of "एक रिवर्स आईटरेटर के साथ मिटाने के लिए कैसे करें"

कुछ और शोध और परीक्षण के बाद मुझे समाधान मिला स्पष्ट रूप से मानक के अनुसार [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) के रूप में उल्लिखित है .बेस () हालांकि जब तक मुझे कुछ याद नहीं आ रहा है, सही वक्तव्य (++ आरआई) है .बेस (), जिसका मतलब है कि आप रिवर्स_आईटरेटर (इटरेटर नहीं) को बढ़ाते हैं।

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