2012-09-27 9 views
7

संभव डुप्लिकेट:
Is there a standard way of moving a range into a vector?C++ 11 एसटीडी के लिए कदम प्रविष्टि :: Deque या std :: सूची

मैं काफी अच्छा कैसे rvalue संदर्भ काम समझते हैं, लेकिन मैं कर रहा हूँ बिल्कुल यकीन नहीं है कि वे एसटीएल में पुनरावृत्तियों के साथ कैसे काम करते हैं। यहां कुछ ऐसा है जो मैं चाहता हूं:

void insertList(std::list<int>& L, std::list<int>&& R, std::list<int>::iterator insertPoint) 
{ 
    L.insert(insertPoint, R.begin(), R.end()); // want to use move semantics 
} 

अब मुझे पता है कि std :: सूची में एक स्प्लिस विधि है। लेकिन मैं जानना चाहता हूं कि यह बिल्कुल काम कर सकता है या नहीं। क्या यह डेक के लिए भी काम कर सकता है?

+3

फिर से खोलने के लिए वोटिंग। जबकि एक ऐसा हिस्सा है जो डुप्लिकेट ('डेक्यू' पर जाने के रूप में चिह्नित) के साथ साझा किया गया है, वहां एक ऐसा हिस्सा भी है जो 'सूची <>' बहुत अलग है और जिसके लिए लिंक किए गए प्रश्न का समाधान खराब है उचित स्पष्टीकरण देने के लिए वैकल्पिक 'splice() ' –

उत्तर

11

splice और चलती कंटेनरों की सामग्री को विभिन्न कार्यों कर रहे हैं। splice (जो deque के साथ नहीं किया जा सकता है) के मामले में पूरे नोड को एक कंटेनर से दूसरे में स्थानांतरित किया जाता है। नोड्स अब मूल कंटेनर में नहीं होंगे, और ऑपरेशन द्वारा कोई आवंटन नहीं किया जाएगा।

के वैकल्पिक एक आप कहा के समान एक एल्गोरिथ्म के साथ सामग्री चलती है, लेकिन एक कदम इटरेटर का उपयोग कर:

L.insert(insertPoint, 
     std::make_move_iterator(R.begin()), 
     std::make_move_iterator(R.end())); 

यह दोनों list और deque लेकिन अर्थ विज्ञान अलग हैं के लिए काम करेंगे । नई सूची में सम्मिलन के लिए std::distance(R.begin(),R.end()) नोड्स के आवंटन की आवश्यकता होगी, जिनकी सामग्री मूल कंटेनर से आगे बढ़कर भर जाएगी। इससे नए नोड्स के निर्माण की लागत कम हो जाती है, लेकिन फिर भी उन्हें आवंटित करने की आवश्यकता होती है। ध्यान दें कि पुरानी सूची में अभी भी सभी नोड्स होंगे, हालांकि वे खाली होंगे क्योंकि डेटा की सामग्री ले जाया गया है।

std::list के मामले में आपको splice पसंद करना चाहिए, लेकिन यह अन्य कंटेनरों पर उपलब्ध नहीं है। अन्य कंटेनरों के लिए आपको ऊपर के दृष्टिकोण के साथ छोड़ा जाएगा, जहां कंटेनर डेटा संरचना बनाने की लागत लेनी होगी, हालांकि संग्रहीत डेटा के निर्माण की लागत से बचा जा सकता है।

+0

+1। ; -] – ildjarn

+0

+1 इटेटर को स्थानांतरित करने के बारे में अच्छी व्याख्या, धन्यवाद – Walter