दिलचस्प पोस्ट
जब मैं डेटाबेस / मॉडल से कोई ऑब्जेक्ट हटाता हूं, तो मैं फ़ाइलों को हटाने के लिए कैसे Django Admin प्राप्त कर सकता हूं? JQuery का सरल स्क्रीन स्क्रैपिंग R: rJava पैकेज अधिष्ठापन असफल आईओएस ऐप की अधिकतम मेमोरी बजट एंड्रॉइड 1.5: एसएमएस संदेश पढ़ना क्या मेरे आवेदन में "एन्क्रिप्शन शामिल है"? HTML अपलोड MAX_FILE_SIZE काम करने के लिए दिखाई नहीं देता jQuery के दो कार्यों के बीच क्लिक / टॉगल करें कंटेनर को सिकुड़ते-टू-फिट बाल तत्व बनाते हैं क्योंकि वे लपेटते हैं डेटा फ्रेम के कॉलम नाम बदलने मेरी खुद की जार मैनिफ़ेस्ट पढ़ना यह सुनिश्चित करने के लिए कि स्ट्रिंग JSON.NET का उपयोग करते हुए मान्य JSON है उद्देश्य-सी: आईडी और शून्य के बीच का अंतर * एक्सेस-कंट्रोल-अनुमति-मूल बाईपास कैसे करें? एक एमपी 4 वीडियो आउटपुट करने के लिए php का उपयोग करना

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

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

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

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