2016-12-21 10 views
16

के साथ const_iterator का उपयोग क्यों किया जा सकता है I eraseconst iterator पर इंप्रेशन का उपयोग नहीं कर सकता था। this code देखें।
नीचे कोड संकलित क्यों करता है (सी ++ 11, जीसीसी)?std :: map :: erase

long getMax(const bool get_new) 
{ 
    long max_val=0; 

    TO now=getNow(); 

    map<TO, long>& m=get_new?m_new:m_old; 

    for(auto it=m.cbegin(); it !=m.cend()) 
    { 
     if(now.compareTime((*it).first)<lookback) 
     { 
      max_val=max(max_val, 
         (*it).second); 
      ++it; 
     } 
     else 
     { 
      it=m.erase(it); 
     } 
    } 

    return max_val; 
} 

map ही स्थिर नहीं है, लेकिन मैं समझता हूँ कि const iterator इस असफल बनाना चाहिए है।

उत्तर

15

व्यवहार C++ 11 से बदल गया है; std::map::eraseconst_iterator अपने पैरामीटर के रूप में लेता है।

void erase(iterator pos);   // (until C++11) 
iterator erase(const_iterator pos); // (since C++11) 
iterator erase(iterator pos);  // (since C++17) 

std::map::erase के लिए, पारित कर दिया इटरेटर सिर्फ स्थान है जहाँ तत्व, इसके माध्यम से तत्व को संशोधित करने के लिए नहीं हटा दिया जाएगा के रूप में प्रयोग किया जाता है। इसका मतलब है const_iterator ठीक होगा। सी ++ 11 से पहले, const_iterator के लिए समर्थन बहुत अच्छा नहीं था, लेकिन स्थिति सी ++ 11 से बदल गई है। iterator के बजाय आपको const_iterator का उपयोग करना चाहिए, जब संभव हो।

9

स्थिति उनकी पहुंच की स्थिरता से स्वतंत्र हैं। यह (सामान्य है) काफी आम है कि खोज वापसी const_iterator कर रही है क्योंकि वे वास्तव में कंटेनर को बिल्कुल नहीं बदलते हैं। हालांकि, अनुक्रमों के उत्परिवर्तन के लिए प्राप्त स्थिति का उपयोग करना वांछनीय है, उदाहरण के लिए, insert() संबंधित स्थिति पर एक तत्व या erase() स्थित तत्व पर। नतीजतन, कंटेनर जहां उत्परिवर्ती संचालन के साथ const_iterator के उपयोग का समर्थन करने के लिए विस्तारित किया गया।

ऐसा लगता है कि प्रासंगिक पेपर N2350 है। मुझे यकीन नहीं है कि यह पेपर नवीनतम संस्करण है या नहीं।

संबंधित मुद्दे