एक्सकोड 4.6 का उपयोग कर मैक ओएस एक्स पर परीक्षण किया गया।किसी सूची के _first_ तत्व को हटाने से `.rend()` को अमान्य क्यों किया जाता है?
इस उदाहरण कोड एक std::list
कार्यों के अंतिम तत्व को हटाने से पता चलता के रूप में मैं उम्मीद: list::end()
के लिए एक इटरेटर संदर्भ अभी भी "अंत अतीत 1" और अभी भी मान्य है, भी पिछले तत्व को हटाने के माध्यम से।
लेकिन दूसरा उदाहरण काउंटर मेरे अंतर्ज्ञान। सूची में list::rend()
बदलता है, जिसे मैंने सोचा था कि "शुरुआत से पहले 1" था।
क्या मेरी उम्मीद गलत थी? यह गलत क्यों था? अंतिम तत्व को हटाने के माध्यम से "1 अतीत के अंत" का आपका संदर्भ वैध क्यों है (क्या यह नहीं होना चाहिए?), लेकिन ") के सामने" 1 () सामने के तत्व को हटाने के बाद अमान्य हो जाता है?
void printList(list<int>& os)
{
for(int& i : os)
printf("%d ", i) ;
puts("");
}
void testList()
{
list<int> os ;
os.push_back(1) ;
os.push_back(2) ;
os.push_back(3) ;
os.push_back(4) ;
os.push_back(5) ;
// Forward iterators: reference to .end() not invalidated when remove last elt.
list<int>::iterator fwdEnd = os.end() ;
printList(os) ;
os.erase(--os.end()) ; // remove the 5 (last elt)
printList(os) ;
if(fwdEnd == os.end()) puts("YES, fwdEnd==os.end() still, iterators not invalidated") ; // I get __this__ result
else puts("NO: fwdEnd INVALIDATED") ;
list<int>::reverse_iterator revEnd = os.rend() ;
// remove the front element
printList(os) ;
os.erase(os.begin()) ; // removes the 1
printList(os) ;
if(revEnd == os.rend()) puts("YES revEnd is still valid") ;
else puts("NO: revEnd NOT valid") ; // I get __this__ result
}
जिस तरह से मैं इसे समझता हूं, एक रिवर्स इटेटरेटर यह इंगित करता है कि यह क्या प्रतीत होता है। एक "शुरुआत से पहले एक" रिवर्स इटेटरेटर एक सामान्य इंटरैटर को लपेटता है जो शुरुआत को संदर्भित करता है। जब लपेटा हुआ इटरेटर अमान्य हो जाता है, तो रिवर्स इटरेटर भी होता है। लेकिन मेरे पास इस बात को वापस करने के लिए मानक से उद्धरण नहीं है। – hvd
मुझे लगता है कि दूसरा प्रश्न होगा: * "क्या 'rbegin' पहले उदाहरण में समान रूप से अमान्य है?" * – user7116