2011-07-08 31 views
6

का आकार (लॉक) आकार ठीक करें क्या वेक्टर के आकार को ठीक करने और अभी भी सामग्री को बदलने का कोई तरीका है?std :: vector

मैंने एक कॉन्स वेक्टर const std::vector<int> vec(10); बनाने की कोशिश की है लेकिन यह मुझे मूल्यों को बदलने से रोकती है।

vec[3] = 3; एक कंपाइलर त्रुटि देता है: केवल-पढ़ने के स्थान का असाइनमेंट।

मैं भी एक गैर स्थिरांक वेक्टर

std::vector<int> vec(10); 
const std::vector<int>& vecref(vec); 

जो एक ही संकलक त्रुटि देता है के लिए एक स्थिरांक संदर्भ के साथ की कोशिश की है।

मैं या तो घोषणा पर या प्रारंभिक चरण के बाद वेक्टर आकार को ठीक करने में सक्षम होना चाहता हूं। मैं एक पुराने फैशन सरणी का उपयोग कर सकता था, लेकिन मैं वेक्टर एल्गोरिदम का उपयोग करने में सक्षम होना चाहता हूँ।

यदि मैं कोई फर्क पड़ता हूं तो मैं g ++ का उपयोग कर रहा हूं।

+1

क्या "वेक्टर एल्गोरिदम" आप का उपयोग करना चाहते हैं?'' में कुछ भी जो निश्चित आकार के std :: वेक्टर के साथ काम करता है, एक सादे सरणी के साथ काम करेगा, क्योंकि एल्गोरिदम कंटेनर के बजाय इटरेटर्स में सौदा करता है। –

+0

मैं 'find_if', 'for_each' और कुछ अन्य लोगों का उपयोग कर रहा हूं। मुझे एहसास नहीं हुआ कि मैं उन्हें सादे सरणी के साथ उपयोग कर सकता हूं। – DanS

+0

यदि आपको यहां एक अच्छा जवाब मिल गया है, तो आपको एक स्वीकार करना चाहिए :) –

उत्तर

3

इसे किसी ऑब्जेक्ट में एम्बेड करें जो केवल उन परिचालनों को प्रदान करता है जिन्हें आप अनुमति देना चाहते हैं।

चीयर्स & hth।,

1

आप एक const vector of pointers कर सकते हैं, और वस्तुओं उनके द्वारा इंगित बदल जाते हैं। यह नहीं कह रहा कि यह सही जवाब है, बस यह संभव है।

1

boost.array, पर एक नज़र डालें, यह आपको वेक्टर अर्थशास्त्र के साथ एक निश्चित आकार सरणी देता है (किसी भी चीज के अपवाद के साथ जो सरणी के आकार को बदल देगा)।

+0

"वेक्टर अर्थशास्त्र" भ्रामक और गलत है। push_back, pop_back, आकार बदलें और अधिक boost.array द्वारा समर्थित नहीं हैं। –

+0

@phresnel: हां, ज़ाहिर है। सरणी के निश्चित आकार प्रकृति को मजबूत करने के लिए संपादित किया गया। – Ferruccio

+1

उचित पुश_बैक होने के लिए पोस्टर के प्रश्न के * किसी भी * उत्तर द्वारा समर्थित नहीं किया जा सकता है, क्योंकि यह परिभाषा द्वारा सरणी के आकार को बदल देता है। – jcoder

6

सी ++ 0x के साथ, आप std :: array <> का उपयोग कर सकते हैं, जो एक अच्छी पुरानी सरणी की तरह है, एसटीएल कंटेनर होने के अतिरिक्त लाभ के साथ, इसलिए कई std :: एल्गोरिदम की अनुमति देता है।

वैकल्पिक रूप से, आप boost :: array को आजमा सकते हैं।

नोट भी है कि std::tr1::array<>


संपादित करें:

Actually, one of the cases that I hadn't gone into was to grow the vector while reading configuration files and then fix the size after that - DanS

फिर, क्यों यह (इनका) नहीं:

#include <vector> 

int main() { 
    std::vector<int> foo; 

    /* ... crunch upon foo ... */ 

    // make a copy vector->vector: 
    const std::vector<int> bar (foo); 

    // make a copy any->vector 
    const std::vector<int> frob (foo.begin(), foo.end()); 
} 

वैकल्पिक रूप से, आप रीसेट() अर्थ विज्ञान की जरूरत है, लेकिन (आकार बदलने के न करे करना चाहते हैं) एट अल, आप एक कंटेनर एडाप्टर लिख सकते हैं:

template <typename T, typename Allocator = allocator<T> > 
class resettable_array { 
public: 
    // container ... 
    typedef typename std::vector<T,Allocator>::iterator iterator; 
    typedef typename std::vector<T,Allocator>::const_iterator const_iterator; 
    ... 

    iterator begin() { return vector_.begin() } 
    const_iterator begin() const { return vector_.begin(); } 
    ... 

    void push_back (T const &v) { vector_.push_back (v); } 
    ... 

    // custom 
    void reset() { ... } 

private: 
    std::vector<T,Allocator> vector_; 
}; 

यह भी देखें:

+0

सी ++ 11 का एक अन्य लाभ 'std :: start' और' std :: end' है, जो 'int [5]' जैसे पुराने पुराने मानक निश्चित आकार सरणी के साथ भी काम करता है, इसलिए ' std :: एल्गोरिदम' और 'std :: numeric' अन्य stl goodness के बीच। –

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