2013-02-21 24 views
24

से तत्वों को स्थानांतरित करना मैं कुछ तत्वों को पहले वेक्टर से दूसरे स्थान पर कैसे स्थानांतरित कर सकता हूं, और तत्व पहले से हटा दिए जाएंगे?
यदि मैं std::move का उपयोग कर रहा हूं, तो तत्व पहले वेक्टर से नहीं हटाए गए हैं।
इस कोड मैंने लिखा है:std :: vector से दूसरे

move(xSpaces1.begin() + 7, xSpaces1.end(), back_inserter(xSpaces2)); 

उत्तर

18

std::move की सुविधा देता है के रूप में उन्हें कॉपी करने, एक संभावित तेजी से निष्पादन की गति के लिए अनुमति का विरोध करने के लिए, वस्तुओं को स्थानांतरित। जब आप मूल्यों की एक श्रृंखला को स्थानांतरित करते हैं तो बचत भी अधिक हो सकती है। हालांकि, जब आप एक कंटेनर से move a range करते हैं, तो कंटेनर अभी भी उन स्थानों को रखता है जिन्हें एक बार इन मानों पर कब्जा कर लिया गया था।

यदि आप उनसे छुटकारा पाना चाहते हैं तो आपको इन प्लेसहोल्डर को हटाने के लिए मैन्युअल रूप से कंटेनर का आकार बदलने की आवश्यकता है (यदि आपको अन्य तत्वों के लिए इन कंटेनर स्पॉट्स का पुन: उपयोग करना पसंद नहीं है)। ऐसा करने का एक तरीका है vector::erase को उसी श्रेणी पर जिसे आप कंटेनर से बाहर ले जाते हैं।

+0

अच्छा जवाब; लेकिन सावधानी बरतें प्रारंभिक वेक्टर इन्सन अनिश्चित स्थिति है, क्योंकि चाल असाइनमेंट कन्स्ट्रक्टर को बुलाया गया है, प्रारंभिक वस्तुओं को स्कॉट मेयर्स को उद्धृत करने के लिए बाहर निकल गया है – Gabriel

+1

एक उदाहरण अच्छा होगा –

3

आप तत्वों में से दूसरे में जिस तरह से आप के बारे में सोच रहे हैं स्थानांतरित नहीं कर सकते; आपको हमेशा को पहले वेक्टर से तत्व पदों को मिटा देना होगा।

यदि आप बदलना चाहते हैं तो सभी तत्व पहले वेक्टर से दूसरे में और इसके विपरीत आप swap का उपयोग कर सकते हैं।

आप तत्वों की एक ही राशि स्थानांतरित करने के लिए दो वैक्टर के बीच चाहते हैं, आप उपयोग कर सकते हैं swap_ranges

+5

जरूर आप कर सकते हो। यही वह कदम है जो सैमांतिक्स के बारे में है। –

+0

@ आर। मार्टिन्होफर्नैंड्स स्पष्ट होने के लिए संपादित किया गया। ओपी एक ऑपरेशन के लिए पूछ रहा था कि उसे दो परिचालनों में क्या करना है, दूसरा हमेशा पहले वेक्टर से मिट रहा है। – alestanis

37

std::move और std::copyतत्वों, नहीं कंटेनर पर कार्य करते हैं। आपको कंटेनर को अलग से बदलना होगा। उदाहरण के लिए, एक नया वेक्टर v2 में v1 के पहले 17 तत्वों को स्थानांतरित करने के लिए:

std::vector<Foo> v1, v2; 

// populate v1 with at least 17 elements... 

auto it = std::next(v1.begin(), 17); 

std::move(v1.begin(), it, std::back_inserter(v2)); // ## 

v1.erase(v1.begin(), it); 

लाइन ## के बाद, v1 के पहले 17 तत्वों अभी भी वहाँ हैं, लेकिन वे कर दिया गया "में ले जाया गया-से" है, इसलिए वे एक अनिश्चित स्थिति में हैं।

+0

सिर्फ वेक्टर पर्याप्त सदस्य को स्वैप नहीं करेगा यहाँ? –

+0

@IvayloStrandjev: आप जो करना चाहते हैं उस पर निर्भर करता है ...यदि आप पहले वेक्टर के बीच से सेगमेंट ले जाना चाहते हैं, तो मुझे नहीं लगता कि स्वैपिंग कितना फायदेमंद होगा। –

+0

@IvayloStrandjev * क्या * के साथ स्वैप? आप एक छेद भर रहे हैं; उपहार का आदान-प्रदान नहीं या मैं अवधारणा को समझ नहीं पा रहा हूं (नरक, इस वीर घंटे में मेरे कैफीन के बिना यह एक चमत्कार है जिसे मैं केरेक की पोस्ट समझता हूं)। संपादित करें: ठीक है। मैं आपकी पोस्ट देखता हूं। * अब * मैं * दोनों * अवधारणाओं को समझता हूं। – WhozCraig

2

पुराने धागे को पुन: स्थापित करना, लेकिन मुझे आश्चर्य है कि std::make_move_iteratorinsert के साथ संयुक्त कोई भी उल्लेख नहीं किया गया है। यह लक्ष्य वेक्टर में preallocating अंतरिक्ष के महत्वपूर्ण प्रदर्शन लाभ है:

v2.insert(v2.end(), std::make_move_iterator(v1.begin() + 7), 
        std::make_move_iterator(v1.end())); 

के रूप में अन्य लोगों ने बताया है, प्रथम वेक्टर v1 अब अनिश्चित राज्य में है, इसलिए erase का उपयोग गंदगी साफ करने के लिए:

v1.erase(v1.begin() + 7, v1.end()); 
+0

@ कैलेथ मैंने सोचा कि कोई भी नोटिस नहीं करेगा :) अपडेट किया गया, धन्यवाद। –