2010-09-29 16 views
16

मुझे पॉइंटर्स के कंटेनर की आवश्यकता है। क्या आप boost::ptr_vector<T> या std::vector<boost::shared_ptr<T> > की अनुशंसा करेंगे? (या कुछ और?)क्या मुझे boost :: ptr_vector <T> या वेक्टर <boost :: shared_ptr <T>> का उपयोग करना चाहिए?

हैं कि ब्याज की है, मेरे वास्तविक डेटा संरचना अपेक्षाकृत जटिल है (here देखें) और वर्तमान में वस्तुओं, नहीं संकेत संग्रहीत करता है, लेकिन मैं इसे बदल नहीं (सूचक कंटेनरों का इस्तेमाल किया), क्रम में करना चाहते हैं

typedef std::multimap<Foo0, std::map<int, double> > VecElem; 
std::vector<VecElem> vec; 
+0

यह अनावश्यक प्रतिलिपि कहां होती है? –

+0

@ इदान: जब भी आप वेक्टर या उपरोक्त से मल्टीमैप में कुछ डालते हैं। – Frank

+3

@Idan: जब आपके पास एक कंटेनर होता है जो पॉइंटर्स स्टोर करता है, तो जब आप ऑब्जेक्ट्स स्टोर करते हैं तो डेटा जोड़ने पर केवल पॉइंटर की प्रतिलिपि बनाई जाएगी, वास्तविक वस्तुओं की प्रतिलिपि बनाई जाएगी। यह एक समस्या है जब आप उन वस्तुओं से निपट रहे हैं जो कॉपी करने के लिए महंगी हैं। – sbi

उत्तर

30

कौन वस्तु का मालिक: अनावश्यक नकल से छुटकारा पाने के लिए? यदि कंटेनर ऑब्जेक्ट्स का मालिक है (जिसका अर्थ है कि ऑब्जेक्ट्स कंटेनर से अधिक नहीं रहना चाहिए), ptr_vector का उपयोग करें। अन्यथा, shared_ptr एस के वेक्टर का उपयोग करें। मानक लाइब्रेरी कंटेनर (जैसे std::vector या std::list) उनके पास मौजूद वस्तुओं का स्वामित्व है, इसलिए ptr_vector के अर्थशास्त्र इसके करीब हैं।

+0

प्रश्न जोड़ें: 'unique_ptr' का 'वेक्टर'' ptr_vector' जैसा ही है? –

+0

@Didier: मुझे उस प्रश्न का उत्तर देने के लिए 'unique_ptr' के बारे में पर्याप्त जानकारी नहीं है। हालांकि, 'ptr_vector' में कम ओवरहेड होगा (जैसा कि @ एसबीआई उनके उत्तर में बताता है)। –

+8

@डिडर: नहीं, 'ptr_vector'' वेक्टर 'की प्रतिलिपि की अनुमति देता है, जो सामग्री को गहरी प्रतिलिपि बनाता है ('new_clone' मुक्त फ़ंक्शन का उपयोग करके) और इस प्रकार पॉलीमोर्फिक कंटेनर के लिए अनुमति देता है। इसमें निस्संदेह इंटरफ़ेस भी है (इटरेटर को संदर्भित करना ऑब्जेक्ट का संदर्भ देता है, ऑब्जेक्ट पर पॉइंटर का संदर्भ नहीं) और अन्य उपहार। –

13

shared_ptr<> में एक साझा स्वामी अर्थपूर्ण है, जो संदर्भ संख्याओं में वृद्धि और कमी के माध्यम से लागू किया जाता है। यह कुछ ओवरहेड के साथ आता है, खासकर जब बहु-थ्रेडिंग सक्षम होती है (क्योंकि उन काउंटरों को तब लॉक करना होगा)।

यदि आपकी ऑब्जेक्ट्स साझा की जाती हैं, तो shared_ptr<> का उपयोग करें।
लेकिन यदि वे प्रभावी रूप से कंटेनर के स्वामित्व में हैं, और कंटेनर के साथ मरना चाहिए, और कंटेनर मरने पर संदर्भित हो सकता है, तो पॉइंटर कंटेनर का उपयोग करें, क्योंकि उनके पास कम ओवरहेड है।
यदि आप अनिश्चित हैं, तो सुरक्षित पक्ष पर होने के लिए shared_ptr का उपयोग करें। यदि यह पता चला है कि आपके पास प्रदर्शन समस्या है, तो आप हमेशा बाद में अनुकूलित कर सकते हैं। (समय-समय पर अनुकूलित सिस्टम काम करने के बजाय एक कार्य प्रणाली को अनुकूलित करना आसान है।)

+6

+1 के लिए एक कार्य प्रणाली को अनुकूलित करना आसान है, फिर समय-समय पर अनुकूलित सिस्टम काम करने के लिए। – balki

+0

_ "कंटेनर के साथ मरना चाहिए" _। – mskfisher

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