2016-06-16 16 views
8

std::array<...> के लिए सबसे अच्छा प्रतिस्थापन क्या है यदि मैं constexpr आकार प्रदान नहीं करना चाहता हूं? मुझे लगा कि std::vector का उपयोग करना सबसे अच्छा होगा और reserve(...) पर ऐसा करें, लेकिन शायद मैं कुछ दिख रहा हूं?सी ++ प्रतिस्थापन std :: array

+3

एक निश्चित आकार ['std :: dynarray'] (http://en.cppreference.com/w/cpp/container/dynarray) के लिए एक प्रस्ताव था। दुर्भाग्य से यह इसे सी ++ 14 में नहीं बनाया गया। – juanchopanza

+0

समिति ने इसे स्वीकार करने का फैसला क्यों नहीं किया? मुझे लगता है कि यह प्रयोगात्मक है, जिसका अर्थ है कि यह शायद अभी भी एक मौका खड़ा है। –

उत्तर

7

हाँ, std::vector का उपयोग [ "क्यों मानक कंटेनर इतनी धीमी गति से कर रहे हैं?" के नीचे देखें]।

तो अपने कोड

std:array<int, 42> my_array; 

द्वारा

std:vector<int> my_array(42); 

नोट यह बदलें है यदि: आप शायद है, reserve उपयोग नहीं करना चाहते, क्योंकि यह vector खाली हो जाती है। यदि आप std::array का उपयोग कर रहे हैं, तो आपके कोड में खाली सरणी की अवधारणा नहीं है, इसलिए इसे std::vector उदाहरण द्वारा सर्वोत्तम रूप से दर्शाया गया है जो निर्माण पर भरा हुआ है, और कभी भी आकार बदलता नहीं है।

+1

'std :: vector ' के साथ, मैं प्रारंभिक क्षमता निर्दिष्ट करने के बजाय 'आकार बदलें (42)' का उपयोग कर सकता हूं। 'My_array (42) 'के साथ, मैं लोगों के बारे में चिंतित हूं कि' 42' प्रारंभिक तत्व है, या इसे 'my_array {42}' में बदल रहा है और चुपचाप चीजों को तोड़ रहा है। – user2357112

+0

इसके साथ एक छोटी सी समस्या यह है कि यह वेक्टर को शून्य के साथ भरता है, जबकि आपके उदाहरण में सरणी की घोषणा इसे अनियमित कर देती है। इससे कोई फर्क नहीं पड़ता कि वेक्टर का आकार बड़ा होने की उम्मीद है। – Ruslan

17

std::vector रनटाइम पर आकार निर्धारित करने की आवश्यकता होने पर, सही विकल्प का सही कंटेनर होना चाहिए।

4

std::vector<> शायद आपका उत्तर है। मैं बस reserve() किसी भी गति की गारंटी नहीं मानता।

Bjarne Stroustrup:

लोग कभी कभी std :: वेक्टर संवर्द्धित बढ़ रही है की लागत के बारे में चिंता। मैं उस बारे में चिंता करता था और उपयोग किया गया आरक्षित() विकास को अनुकूलित करता था। मेरे कोड को मापने के बाद और वास्तविक प्रोग्राम्स में आरक्षित() के प्रदर्शन लाभों को खोजने में परेशानी के बाद, मैंने इटरेटर अमान्यता (मेरे कोड में एक दुर्लभ मामला) से बचने के लिए इसकी आवश्यकता है, इसके अलावा मैंने इसका उपयोग बंद कर दिया। दोबारा: से पहले मापें आप अनुकूलित करें।

http://www.stroustrup.com/bs_faq2.html

+0

मैं कहूंगा कि 'रिजर्व' को कॉल करने वाले ज्यादातर मामलों में स्पीडअप की गारंटी के बारे में इतना कुछ नहीं है (जिसका मतलब है कि एसटीएल कॉल के दौरान "मंदी की गारंटी देता है"), लेकिन जब यह सरल होता है तो छोटे समाधान को चुनने के बारे में स्पष्ट। अक्सर आप आवंटन समय पर जानते हैं कि आपका वेक्टर कितना बड़ा हो जाएगा, भले ही किसी कारण से आप इसे आकार में नहीं बना सकें, लेकिन इसे भरने के लिए 'push_back' को दोहराएं। फिर 'रिजर्व' को कॉल नहीं करना मूर्खतापूर्ण होगा क्योंकि एक मैच मिलने पर रैखिक खोज से बाहर नहीं हो रहा है; सुनिश्चित करें कि गति छोटा हो सकता है, लेकिन सुधार स्पष्ट है। –

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