c++ - Strange iterator behaviour -


  # शामिल करें "stdafx.h" int _tmain (int argc, _TCHAR * argv []) {string s = "क्यों नहीं एक विचार मिला है।"; ऑटो आइफ़ = s.begin (); ऑटो अंत = s.end (); जबकि (पूछताछ करना & lt; अंत) {cout & lt; & lt; * भुनाना & lt; & lt; '\ N'; यदि (* beg == 'ए') {// whithout यह निर्माण पूरी तरह से काम करता है beg = s.erase (beg); } ++ भीख मांगना; } वापसी 0; }  

क्यों अगर मैं इस स्ट्रिंग से एक या एक से अधिक वर्ण मिटा देता हूं तो यह कोड टूट जाता है? मुझे लगता है कि यह अंतराल द्वितीय से अधिक पते पर मिटाया हुआ ऑपरेशन के बाद वापस लौटने वाले के साथ कुछ करना है, लेकिन मुझे यकीन नहीं है और यह निश्चित रूप से सही व्यवहार नहीं है। या यह है?

इस कोड के साथ कई समस्याएं हैं।

  1. s.end () के मान कैश न करें; जैसा कि आप तत्वों को हटाते हैं, इसके रूप में परिवर्तन होता है।
  2. का उपयोग न करें अंत। मुहावरेदार दृष्टिकोण beg! = End लिखना है यदि आप पिछले अंत को पुनरावृत्त करने का प्रयास करते हैं, तो परिणाम अपरिभाषित है, और स्ट्रिंग लायब्रेरी का एक डीबग संस्करण जानबूझकर आपकी प्रक्रिया को क्रैश कर सकता है, इसलिए यह & lt; का उपयोग करने के लिए अर्थहीन है
  3. s.erase (बेख) हो सकता है s.end () , उस मामले में ++ भीख माँगता < कोड> आपको अंत में ले जाता है।

    यह एक (मुझे लगता है) सही संस्करण है:

      int _tmain (int argc, _TCHAR * argv []) {String s = "एक विचार क्यों नहीं मिला है।"; के लिए (स्वत: beg = s.begin (); beg! = S.end ();) {cout & lt; & lt; * भुनाना & lt; & lt; '\ N'; यदि (* beg == 'ए') {// whithout यह निर्माण पूरी तरह से काम करता है beg = s.erase (beg); } और {++ भीख; }}}  

    संपादित करें: मैं फ्रेड ओवरफ्लो के उत्तर को स्वीकार करने का सुझाव देता हूं। यह ऊपर की तुलना में सरल और तेज है।


Comments

Popular posts from this blog

windows - Heroku throws SQLITE3 Read only exception -

lex - Building a lexical Analyzer in Java -

python - rename keys in a dictionary -