2009-01-19 11 views
35

एक पुनरावर्तक का उपयोग कर वेक्टर के माध्यम से पुनरावृत्ति कर रहा है और प्रतिलिपि बनाने की सबसे इष्टतम विधि सूची में कॉपी कर रहा है। कोई सिफारिशें?एसटीएल में एक सूची में वेक्टर की प्रतिलिपि बनाने का सबसे अच्छा तरीका?

उत्तर

81

आप मानक प्रतिलिपि एल्गोरिदम का पुन: उपयोग क्यों नहीं करेंगे?

std::copy(vector.begin(), vector.end(), std::back_inserter(list)); 
+0

stl :: प्रतिलिपि के बजाय std :: प्रति होना चाहिए, लेकिन अन्यथा यह प्रतिलिपि बनाने के लिए इटरेटर का उपयोग करते समय यह पसंदीदा तरीका है। – workmad3

0

आप <algorithm> हैडर से जटिल चीजों का उपयोग करने के उदाहरण for_each या copy के लिए कोशिश कर सकते हैं ... लेकिन वे मेरी राय में, एक ही बात माना जायेगा।

+0

for_each की राशि समान होगी। प्रदान किए गए इटरेटर्स के आधार पर अधिक कुशल प्रति यांत्रिकी प्रदान करने के लिए प्रतिलिपि को अधिभारित किया जा सकता है, और आम तौर पर पसंदीदा तंत्र है। – workmad3

56

आप एक नई सूची बना रहे हैं, तो आप एक निर्माता है कि शुरू और समाप्त iterators लेता है का लाभ ले सकते:

std::list<SomeType> myList(v.begin(), v.end()); 

Kasprzol के जवाब एकदम सही है अगर आप किसी मौजूदा सूची आप को संलग्न करना चाहते हैं।

1

मुझे एक नई सूची बनाने के लिए यह सुझाव पसंद है।

std::list<SomeType> myList(v.begin(), v.end()); 

लेकिन मौजूदा सूची में शामिल होने पर, निम्नलिखित छोटे डेटा सेट के लिए इष्टतम हो सकता है। "इष्टतम" से, मेरा मतलब है कि यह याद रखना सबसे आसान है कि कैसे करना है और समझने में आसान तरीका है। वैक्टर पर iterators का उपयोग करते हुए कई मामलों में बहुत ज्यादा पंडिताऊ हो सकता है (ये व्यक्तिपरक बयान कर रहे हैं, मुझे यकीन है कि यह कैसे अपने दिमाग वायर्ड है पर निर्भर करता है हूँ।)

for (unsigned i=0; i<v.size(); i++) myList.push_back(v[i]); 

। सरल अनुक्रमण आमतौर पर ठीक काम करता है।

एक और धागा इटरेटर बनाम इंडेक्स को संबोधित करता है (here)। उस धागे में, उठाए गए उत्तर मूल रूप से इटरेटर पसंद करते थे क्योंकि वे अधिक सामान्य होते हैं। लेकिन यदि वेक्टर सबसे अधिक इस्तेमाल किए जाने वाले कंटेनर प्रकार हैं, तो मुझे लगता है कि इस तरह के सरल एल्गोरिदम का विशेषज्ञ होना उचित है।

6
list.assign(vector.begin(), vector.end()); 
+0

यह सहायक है, लेकिन संभावित वीएलक्यू ध्वज से बचने के लिए आपको शायद इस उत्तर में कुछ गैर-कोड जोड़ना चाहिए। –

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

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