2008-10-06 7 views
5

फ़ंक्शन तर्क के रूप में मुझे अज्ञात लंबाई और मानों के साथ vector<double>& vec (आउटपुट वेक्टर, इसलिए गैर-कॉन्स्ट) मिलता है। मैं इस वेक्टर को सभी शून्यों के साथ एक विशिष्ट लंबाई एन में शुरू करना चाहता हूं।(पुनः) प्रारंभिक मानों के साथ एक निश्चित लंबाई में एक वेक्टर शुरू करें

यह काम करेंगे

vec.clear(); 
vec.resize(n, 0.0); 

और यह रूप में अच्छी तरह से काम करेगा:

vec.resize(n); 
vec.assign(n, 0.0); 

है दूसरा और अधिक कुशल (क्योंकि कोई स्मृति आवंटन रद्द करने/आवंटन शामिल है)? क्या ऐसा करने का एक और अधिक प्रभावी तरीका है?

उत्तर

9
std::vector<double>(n).swap(vec); 

इस के बाद, vec के लिए आकार और क्षमता n गारंटी है, सभी मूल्यों 0.0 के साथ।

शायद अधिक मुहावरेदार रास्ता के बाद से सी ++ 11

vec.assign(n, 0.); 
vec.shrink_to_fit(); 
दूसरी पंक्ति वैकल्पिक साथ

है। ऐसे मामले में जहां vecn तत्वों से अधिक शुरू होता है, चाहे shrink_to_fit पर कॉल करना है, फिर से आवंटन करने के लिए आवश्यकतानुसार अधिक मेमोरी पर होल्डिंग के बीच एक व्यापार-बंद है।

+0

आपके सुधार के लिए धन्यवाद --- मैंने अपनी प्रविष्टि भी अपडेट की है। :-) –

9
std::vector<double>(n).swap(vec); 

इसका वास्तव में आपके वेक्टर को भी कॉम्पैक्ट करने का लाभ है। (अपने पहले उदाहरण में, clear() अपने वेक्टर संकुचित करने के लिए गारंटी नहीं है।)

+0

आप उस आकार का आकार बदल सकते हैं() वेक्टर क्षमता को कम नहीं करते हैं। –

+0

सच है, खेद है कि मैंने इसे मंजूरी दे दी (क्योंकि मैं आकार() को आकार बदलने के विशेष मामले के रूप में देखता हूं())। :-) –

+0

यह गैर-मानक सी ++ है - स्वैप एक गैर-कॉन्स्ट संदर्भ लेता है जो अस्थायी वेक्टर से बंधे नहीं होगा। दृश्य सी ++ इसे एक भाषा विस्तार के रूप में अनुमति देता है। –

3

खैर के तरीके यह करने के लिए के दौर जाने :)

vec.swap(std::vector<double>(n)); 
std::vector<double>(n).swap(vec); 
std::swap(vector<double>(n), vec); 
std::swap(vec, vector<double>(n)); 
+0

पिछले दो में वांछित प्रभाव नहीं है, कम से कम std :: स्वैप के डिफ़ॉल्ट कार्यान्वयन के तहत। :-) –

+1

वास्तव में यह करता है :) std :: स्वैप वेक्टर में अधिभारित है और सदस्य फ़ंक्शन को कॉल करता है। यह मानक द्वारा आवश्यक है। –

2

कोड के टुकड़े कि आप किसी भी स्मृति आवंटन रद्द कर पोस्ट में से कोई, तो वे लगभग बराबर हैं।

स्वैप चाल जो हर कोई पोस्टिंग करता रहता है उसे निष्पादित करने में अधिक समय लगेगा, क्योंकि यह मूल रूप से वेक्टर द्वारा उपयोग की जाने वाली मेमोरी को हटा देगा। यह वांछनीय हो सकता है या नहीं भी हो सकता है।

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