2011-10-11 23 views
11

C++11 से पहले मैंने गहरी प्रतिलिपि ओवरहेड्स से बचने के लिए स्वैप-टू-बैक का उपयोग किया है, जैसे:Std :: move का उपयोग करना

vector<vector<Object> > Objects; 

for(/* some range */) 
{ 
    vector<Object> v; 
    for(/* some other range */) 
    { 
     v.push_back(/* some object */); 
    } 
    Objects.push_back(vector<Object>()); 
    Objects.back().swap(v); 
} 

swapObjects ObjectsObjectsObjectsObjectsObjects के बजाय गहरी प्रतिलिपि ओवरहेड से बचने के लिए Objects में Objects को स्थानांतरित करने के लिए मैं कैसे उपयोग कर सकता हूं?
मुझे पता है कि यहां कई सारे वर्कअराउंड हैं जैसे बहु सरणी या सीधे Objects.back() में डालना, लेकिन मुझे समझने के लिए std::move के उपयोग की एक उदाहरण की आवश्यकता है।

+2

क्यों आप 'v' बिल्कुल बना सकता हूँ? क्यों न केवल ऑब्जेक्ट्स में रिक्त वेक्टर जोड़ें और फिर 'ऑब्जेक्ट्सबैक()। Push_back()' इसमें? यह आसान होने के दौरान और भी ऊपर की ओर हटा देता है। – Ayjay

+0

@Ajayay: सही उत्तर रखने और बहुत कम ध्यान देने के लिए शेष प्रश्न – Dani

उत्तर

16
vector<vector<Object> > Objects; 

for(/* some range */) 
{ 
    vector<Object> v; 
    for(/* some other range */) 
    { 
     v.push_back(/* some object */); 
    } 
    Objects.push_back(std::move(v)); 
} 
+0

लेकिन यह पीछे 'v' छोड़ देता है। मुझे समझ में आया कि 'std :: move' कुछ हद तक विनाशकारी होना चाहिए। – Dani

+2

@Dani: मान लीजिए। कोशिश करो। दरअसल, 'वेक्टर :: वेक्टर (वेक्टर एंड&)' के स्रोत को पढ़ने के लिए भी पर्याप्त होगा। अर्थशास्त्र आपके 'std :: swap' संस्करण के करीब हैं - लेकिन सामान्य मामले में अधिक सुरुचिपूर्ण और संभवतः अधिक कुशल – sehe

+0

यदि ऑब्जेक्ट का डिफ़ॉल्ट कन्स्ट्रक्टर गैर-तुच्छ है तो निश्चित रूप से अधिक कुशल। – ildjarn

17
Objects.push_back(std::move(v)); 
+2

+1 पढ़ें – sehe

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