2012-12-28 20 views
6

संभव डुप्लिकेट:
Does moving a vector invalidate iterators?क्या std :: vector :: डेटा() चलकर संरक्षित है?

पर विचार करें निम्नलिखित कोड:

std::vector<T> prepare(T*& data) { 
    std::vector<T> buffer; 
    // Fill in buffer. 
    data = buffer.data(); 
    return buffer; 
} 

... 

T* data; 
auto vec = prepare(data); 
// line 12 

यह लाइन 12 में है कि vec.data() != data संभव है? इसी तरह,

std::vector<T> buffer; 
// ... Fill in buffer ... 
T* data = buffer.data(); 
auto vec = std::move(buffer); 
// line 5 

क्या यह संभव है कि लाइन 5 में vec.data() != data?

व्यावहारिक रूप से libstdC++ और libC++ के कार्यान्वयन में दोनों संभव नहीं हैं, क्योंकि चालक रचनाकारों को सरल सूचक असाइनमेंट के रूप में कार्यान्वित किया जाता है, लेकिन ऐसा लगता है कि मानक इस पर कुछ भी निर्दिष्ट नहीं करता है (Is the capacity required to be preserved when moving a std::vector? के समान)। क्या "निरंतर जटिलता" गारंटी दे सकती है कि vec.data() == data?

+0

चीजें जो इटरेटर्स/पॉइंटर्स को अमान्य करती हैं वे बहुत अच्छी तरह से गणना की जाती हैं। –

+0

यह भी संबंधित है: http://stackoverflow.com/questions/4124989/does-stdvectorswap-invalidate-iterators –

उत्तर

0

निरंतर जटिलता का मतलब है कि कंटेनर को अलग-अलग तत्वों की प्रतिलिपि बनाने/स्थानांतरित करने की अनुमति नहीं है, इसलिए इसे मौजूदा संग्रहण के स्वामित्व को नए ऑब्जेक्ट में स्थानांतरित करना होगा, इसलिए data() द्वारा लौटाए गए पॉइंटर समान होना चाहिए।

चाल असाइनमेंट (निर्माण को स्थानांतरित करने के बजाए) के लिए केवल यह सच है कि propagate_on_container_move_assignment वेक्टर के आवंटक प्रकार या आवंटकों के बराबर तुलना करने के लिए सच है।

+0

कुछ पागल कार्यान्वयन अलग-अलग तत्वों की निरंतर संख्या को स्थानांतरित/कॉपी कर सकता है। – zch

+0

@zch: यह संगतता आवश्यकता से मना कर दिया गया है। –

+0

@BenVoigt, 'if (<10) copyAll() के बारे में क्या; अन्यथा चालान(); '? – zch

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