2014-09-08 14 views
7

ऐसा लगता है कि हर बार जब आप std::vector पर कोई नया तत्व जोड़ते हैं, यदि खाली तत्व नहीं हैं, तो आवंटित तत्वों की संख्या दोगुना हो जाती है (कम से कम जीसीसी 4.9 में)। मुझे लगता है कि यह अमूर्त निरंतर समय जटिलता प्राप्त करने के लिए किया जाता है।std :: वेक्टर और मेमोरी आवंटन

जैसे, इस कोड को चलाने के बाद:

v.push_back (1); 
v.push_back (2); 
v.push_back (3); 
v.push_back (4); 
v.push_back (5); 

v.shrink_to_fit(); // capacity is 5 now 
v.push_back (6); 

std::cout << v.capacity() << std::endl; 

उत्पादन 10

स्मृति विवश प्रणालियों में है, वहाँ तो भी यह एक प्रदर्शन की कीमत पर है इस व्यवहार को रोकने के लिए किसी भी तरह से है दंड?

इसके अलावा, यह इंगित करना संभव होगा कि इसे केवल दोगुनी करने के बजाय तत्वों की एक निश्चित संख्या आवंटित करनी चाहिए?

मुझे पता है कि मैं नए तत्व जोड़ने से पहले std::vector::reserve() पर कॉल कर सकता हूं, लेकिन यह मेरे मामले में एक गड़बड़ लगता है ... std::vector::shrink_to_fit() पर कॉल करना एक और दृष्टिकोण है, लेकिन असुविधाजनक भी है।

+0

क्या आप वास्तव में 'shrink_to_fit' पर कॉल के बाद क्षमता की जांच करते थे? – juanchopanza

+5

गड़बड़ी से बचने के लिए, आप अपना खुद का मुफ्त फ़ंक्शन लिख सकते हैं जो एक वेक्टर और तत्व जोड़ने के लिए लेता है और फिर 'push.back' के बाद 'v.reserve (v.size() + 1)' करता है। – dlf

+3

उस मामले में सरणी का उपयोग क्यों नहीं करें (यदि आपको निश्चित आकार की आवश्यकता है) – 4pie0

उत्तर

5

कोई रास्ता नहीं है।

आपका एकमात्र विकल्प अपने स्वयं के वेक्टर डेटा संरचना को लिखना है और इस तरह आप जो भी चाहें कर सकते हैं (या आप केवल इंटरनेट/सी ++ लाइब्रेरी के कार्यान्वयन की प्रतिलिपि बना सकते हैं और आपको जो चाहिए उसे बदल सकते हैं और उस नए वेक्टर को शामिल कर सकते हैं आपके कार्यक्रम में)।

दरअसल आप एक सरणी और realloc कमांड का भी उपयोग कर सकते हैं।

+0

आप रीयलॉक के साथ एक सरणी का उपयोग कैसे करते हैं? –

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