मैंने हाल ही में सी ++ में रिवर्स इटरेटर्स के साथ काम करने के सही तरीके के बारे में सीखा है (विशेष रूप से जब आपको एक को मिटाना होगा)। (this question और this one देखें।)पीछे की ओर फिर से चलाने के लिए, या रिवर्स_इटरेटर के साथ संघर्ष करने के लिए एक नियमित पुनरावर्तक का उपयोग करें?
यह आप इसे कैसे करना चाहिए रहे हैं:
typedef std::vector<int> IV;
for (IV::reverse_iterator rit = iv.rbegin(), rend = iv.rend();
rit != rend; ++rit)
{
// Use 'rit' if a reverse_iterator is good enough, e.g.,
*rit += 10;
// Use (rit + 1).base() if you need a regular iterator e.g.,
iv.erase((rit + 1).base());
}
लेकिन मैं सोचा कि यह बेहतर है लगता है
(
इस, नहीं मानकों मत करो आज्ञाकारी, MooingDuck बताते हैं):
for (IV::iterator it = iv.end(), begin = iv.begin();
it-- != begin;)
{
// Use 'it' for anything you want
*it += 10;
iv.erase(it);
}
विपक्ष:
-
आप मुझे बताओ। इसके साथ क्या गलत है? - यह मानक मानकों के अनुरूप नहीं है, क्योंकि म्यूइंग डक बताते हैं। यह काफी नीचे दिए गए किसी भी संभावित फायदे को ओवरराल करता है।
पेशेवरों: के लिए-लूप
+1
- रिवर्स के लिए एक परिचित मुहावरा उपयोग करता है: : सूची भी:
it = il.erase(it);
- यदि आप कोई तत्व मिटाते हैं, तो आपको iterator समायोजित करने की आवश्यकता नहीं है
- आप मिटाना हैं, तो आप शुरू iterator
आपका मतलब यह है कि यह अनिश्चित व्यवहार है और सामान्य स्थितियों में विफल/दुर्घटनाग्रस्त हो जाएगा? इसे खाली 'मानचित्र' के साथ आज़माएं। –
एक उत्तर में विस्तार करने के लिए देखभाल? क्या यूबी इनपुट इनपुटर को कम करता है या शुरुआत से कम हो रहा है? क्या यह सभी कंटेनरों के लिए यूबी है? – Dan
इनपुट या आउटपुट इटरेटर को कम नहीं कर सकता (मैं उसको, अच्छी आंख भूल गया), और आप किसी कंटेनर के लिए शुरुआत में भी कमी नहीं कर सकते हैं। –