c++ - क्या std:: vector:: swap iterators को अमान्य कर देता है?




visual-c++ stl (3)

यदि मैं दो वैक्टरों को स्वैप करता हूं, तो क्या उनके इटरेटर वैध रहेंगे, अब सिर्फ "अन्य" कंटेनर को इंगित करेंगे, या इटरेटर को अमान्य कर दिया जाएगा?

यही दिया गया है:

using namespace std;
vector<int> x(42, 42);
vector<int> y;
vector<int>::iterator a = x.begin(); 
vector<int>::iterator b = x.end();

x.swap(y);

// a and b still valid? Pointing to x or y?

ऐसा लगता है कि इस बारे में कुछ भी नहीं है:

[एन 30 9 2 - 23.3.6.2]

void swap(vector<T,Allocator>& x);

प्रभाव: एक्स के साथ * की सामग्री और क्षमता () का आदान-प्रदान करता है।

ध्यान दें कि चूंकि मैं वीएस 2005 पर हूं, इसलिए मुझे इटरेटर डीबग चेक इत्यादि के प्रभाव में भी रूचि है। (_SECURE_SCL)


दो वैक्टरों को स्वैप करने से इसके तत्वों (सी ++ 03, 23.1.11) के इटरेटर, पॉइंटर्स और संदर्भों को अमान्य नहीं किया जाता है।

आम तौर पर इटरेटर में इसके कंटेनर का ज्ञान होता है, और स्वैप ऑपरेशन इसे दिए गए इटरेटर के लिए बनाए रखता है।

वीसी ++ 10 में वेक्टर कंटेनर को इस संरचना का उपयोग <xutility> में प्रबंधित किया जाता है, उदाहरण के लिए:

struct _Container_proxy
{   // store head of iterator chain and back pointer
    _Container_proxy()
    : _Mycont(0), _Myfirstiter(0)
    {   // construct from pointers
    }

    const _Container_base12 *_Mycont;
    _Iterator_base12 *_Myfirstiter;
};

विजुअल स्टूडियो 2005 के लिए, मैंने अभी इसका परीक्षण किया है। मुझे लगता है कि यह हमेशा काम करना चाहिए, क्योंकि वेक्टर :: स्वैप फ़ंक्शन में सब कुछ स्वैप करने के लिए एक स्पष्ट चरण भी शामिल है:

 // vector-header
    void swap(_Myt& _Right)
        {   // exchange contents with _Right
        if (this->_Alval == _Right._Alval)
            {   // same allocator, swap control information

 #if _HAS_ITERATOR_DEBUGGING
            this->_Swap_all(_Right);
 #endif /* _HAS_ITERATOR_DEBUGGING */
 ...

इटेटरेटर्स अब अपने स्वैच्छिक वेक्टर ऑब्जेक्ट में अपने मूल तत्वों को इंगित करते हैं। (ओई डब्ल्यू / आरजी ओपी के लिए, उन्होंने पहले x में तत्वों की ओर इशारा किया, स्वैप के बाद वे y में तत्वों को इंगित करते हैं।)

ध्यान दें कि n3092 ड्राफ्ट में §23.2.1 / 9 में आवश्यकता निर्धारित की गई है:

स्वैप के बाद अन्य कंटेनर में स्वैप उसी तत्व को संदर्भित करने से पहले प्रत्येक कंटेनर एक कंटेनर में तत्व का जिक्र करता है।






iterator