2015-03-05 11 views
7

क्या कोई सी ++ प्रकार है जो "गतिशील आकार वाले गैर आकार बदलने योग्य सरणी" जैसा कार्य करता है? प्रकार इस तरह की दो चीजों में से एक के रूप में के बारे में सोचा जा सकता है:गतिशील रूप से आकार बदलकर गैर आकार बदलने योग्य सरणी

  • vector<T> लेकिन resize, push_back बिना, आदि
  • array<T,N> लेकिन जहां N गतिशील और स्थिर नहीं है।

मुझे ऐसा समाधान नहीं चाहिए जो केवल तभी काम करता है जब सरणी के तत्वों का प्रकार एक गैर-प्रतिलिपि प्रकार है। मुझे एक सामान्य समाधान चाहिए।

+0

क्यों आप इस की ज़रूरत है? आप या तो वेक्टर या सरणी का उपयोग क्यों नहीं कर सकते? – user463035818

+1

मुझे अपने प्रकार पसंद हैं जितना संभव हो सके सटीक होना। मैं कुछ 'वेक्टर' का उपयोग करने की योजना बना रहा हूं, लेकिन इसके आकार को केवल एक बार सेटिंग करता हूं और फिर केवल इसके मान बदलता हूं। मैं पसंद करता हूं कि अगर मैं टिप्पणी के माध्यम से टाइप सिस्टम के माध्यम से इसे दस्तावेज कर सकता हूं। – tohava

+0

@ साइबर - लेकिन मैं इसे केवल गैर-लोकप्रिय मूल्य प्रकारों के लिए नहीं चाहता हूं, मैं इसे सभी प्रकार के लिए चाहता हूं। – tohava

उत्तर

22

हां, वहां (बहुत अधिक) है। std::unique_ptr<T[]>। प्राथमिक टेम्पलेट इस मामले है, जो उचित इंटरफेस प्रदान करता है के लिए एक आंशिक विशेषज्ञता (ऑपरेटर [], कोई ऑपरेटर * आदि)

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

template <class T, class A = std::allocator<T>> 
struct FixedVector : private std::vector<T, A> 
{ 
    using FixedVector::vector::vector; 
    using FixedVector::vector::operator=; 
    using FixedVector::vector::get_allocator; 
    using FixedVector::vector::at; 
    using FixedVector::vector::front; 
    using FixedVector::vector::back; 
    using FixedVector::vector::data; 
    using FixedVector::vector::begin; 
    using FixedVector::vector::cbegin 
    using FixedVector::vector::end; 
    using FixedVector::vector::cend; 
    using FixedVector::vector::empty; 
    using FixedVector::vector::size; 
    using FixedVector::vector::operator[]; 
}; 
+2

अगर मैं गलत हूं तो मुझे सही करें, लेकिन इसे 'कॉन्स्ट' होना चाहिए क्योंकि अन्यथा कोई सूचक को प्रतिस्थापित कर सकता है। सही? एक 'कॉन्स' यह वास्तव में एक बार के आकार बदलने योग्य वेक्टर के रूप में काम करने की अनुमति देता है और कुछ भी नहीं। – tohava

+0

'उपयोग' – tohava

+0

के साथ बहुत अच्छी चाल एक 'const std :: vector <>' का उपयोग करने जैसा लगता है स्पष्ट समाधान – Arvid

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