2016-12-21 8 views
11

देखें, जैसे,http://en.cppreference.com/w/cpp/container/map/eraseसी ++ 17 में, सहयोगी कंटेनरों के पास 'मिटाने' सदस्य फ़ंक्शन क्यों होता है जो (गैर-`const`) `iterator` लेता है?

सी ++ वहाँ 03 में तीन भार के थे:

void erase(iterator pos); 
void erase(iterator first, iterator last); 
size_type erase(const key_type& key); 

सी ++ 11 में, पहले और दूसरे भार के const_iterator इतना है कि वे कर सकते थे लेने के लिए बदल रहे थे iterator या const_iterator के साथ बुलाया जाए।

iterator erase(const_iterator pos); 
void erase(const_iterator first, const_iterator last); 
size_type erase(const key_type& key); 

सी ++ 17 में, एक गैर स्थिरांक अधिभार गया था फिर से शुरू की:

iterator erase(const_iterator pos); 
iterator erase(iterator pos); 
void erase(const_iterator first, const_iterator last); 
size_type erase(const key_type& key); 

पहले अधिभार भी मिट जाने के बाद एक तत्व को इटरेटर वापसी होने से सुधार इसकी आवश्यकता क्यों है? यह erase के लिए जोड़ा गया था, न ही insert के लिए, न ही vector, deque, और list जैसे किसी भी अनुक्रम कंटेनर के लिए।

उत्तर

14

यह LWG defect 2059 को संबोधित करने के लिए किया गया था। अंत में लिंक

#include <map> 

struct X 
{ 
    template<typename T> 
    X(T&) {} 
}; 

bool operator<(const X&, const X&) { return false; } 

void erasor(std::map<X,int>& s, X x) 
{ 
    std::map<X,int>::iterator it = s.find(x); 
    if (it != s.end()) 
    s.erase(it); 
} 

कॉल map::erase करने से उदाहरण पर विचार अस्पष्ट है क्योंकि map::erase(const_iterator) और map::erase(key_type const&) दोनों समान रूप से अच्छा मैचों रूप में वे एक एक उपयोगकर्ता परिभाषित रूपांतरण की आवश्यकता है।

map::erase(iterator) अधिभार को पुन: प्रस्तुत करना इस समस्या को हल करता है।

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