2010-10-24 8 views
18

मेरे कार्यक्रम में मेरे पास एक एसटीएल सेट है।सी ++ में कंटेनर में संदर्भ (पॉइंटर्स नहीं) क्यों संग्रहीत करते हैं?

set<string> myStrings; 

मेरे कोड की दक्षता में सुधार करने के लिए मैंने इसे केवल पॉइंटर्स को पकड़ने के लिए बदल दिया। (मैं संग्रहीत करने के लिए वास्तविक स्ट्रिंग प्रतियां जरूरत नहीं है।)

set<string*> myStrings; 

मैंने पढ़ लिया है यह संदर्भ के साथ संकेत दिए गए विकल्प जब संभव हो एक अच्छा अभ्यास है कि। (बेशक, एक सूचक की वास्तविक कार्यक्षमता की जरूरत ही अगर नहीं है।)

set<string&> myStrings; 

बाद भी मुझे, संकलक त्रुटियों की एक बहुत कुछ देता है, हालांकि। कंटेनर तत्वों के रूप में संदर्भों का उपयोग करना क्यों संभव नहीं है?

+2

'shared_ptr' जैसे स्मार्ट पॉइंटर का उपयोग करने पर विचार करें (या, यदि आपका कार्यान्वयन रैल्यू संदर्भों का समर्थन करता है, तो 'unique_ptr', हालांकि आपकी समस्या का विवरण यह ऐसा नहीं लगता है कि आप जो खोज रहे हैं)। –

+2

एक तरफ: आईएमएचओ, "संभव होने पर संदर्भों के साथ प्रतिस्थापन पॉइंटर्स" आमतौर पर समय की बर्बादी है, क्योंकि वे इतने सीमित हैं, और अनिवार्य रूप से आपको उन सभी को स्वैप करने के लिए नेतृत्व करेंगे जब आप बाद में महसूस करेंगे कि आपको उनकी आवश्यकता है नल, या फिर से सीट, या जो कुछ भी। संदर्भों की वास्तव में आवश्यकता का एकमात्र कारण यह है कि कुछ ऑपरेटर ओवरलोड को वाक्य रचनात्मक रूप से सुखद लगाना है। –

+1

आपको क्या लगता है कि स्ट्रिंग्स के बजाए स्ट्रिंग्स पॉइंटर्स स्ट्रिंग्स के बजाए इसे अधिक कुशल बनाते हैं। आधुनिक तारों में एक बहुत ही कुशल प्रतिलिपि तंत्र है, इसलिए यह संभावना नहीं है कि आपको जो लाभ मिलेगा वह महत्वपूर्ण होगा और कोड में जो अतिरिक्त जटिलता शामिल होगी वह लाभ के लायक नहीं होगी। –

उत्तर

36

कंटेनर स्टोर ऑब्जेक्ट्स। संदर्भ वस्तुएं नहीं हैं।

सी ++ 11 विनिर्देश स्पष्ट रूप से (§23.2.1 [container.requirements.general]/1):

कंटेनर वस्तुओं है कि अन्य वस्तुओं की दुकान कर रहे हैं।

+1

यह एक अच्छा जवाब नहीं है। सी ++ में कंटेनर में ऑब्जेक्ट्स नहीं, कुछ भी हो सकता है। उदाहरण के लिए आप सेट कर सकते हैं, आदि सेट करें। संदर्भ एक भौतिक स्तर पर एक सूचक है, हालांकि संकलक को आपके तत्व प्रकार के संदर्भ लेने वाले फ़ंक्शंस को तुरंत चालू करने की आवश्यकता होती है, और क्योंकि C++ डबल संदर्भों को संभाल नहीं सकता है, सेट करें असंभव है। – mojuba

+8

@mojuba - सी ++ में, जब हम वस्तुओं को कहते हैं, तो हमारा मतलब है कि किसी भी डेटा प्रकार के उदाहरण, जिसमें बिल्टिन शामिल हैं। –

+6

@mojuba: दोनों 'int' और' int * 'ऑब्जेक्ट्स हैं (सी ++ में, "ऑब्जेक्ट स्टोरेज का क्षेत्र है।" (सी ++ 03 1.8/1))। एक संदर्भ कभी एक वस्तु नहीं है। सी ++ मानक को उद्धृत करने के लिए, "कंटेनर ऑब्जेक्ट्स हैं जो अन्य ऑब्जेक्ट्स स्टोर करते हैं" (23.1/1)। –

9

"क्यों" से सीधे प्रासंगिक नहीं है, लेकिन ऐसा करने के लिए अंतर्निहित इच्छा का उत्तर देने के लिए, मैं उल्लेख करता हूं कि C++ 11 मानक लाइब्रेरी में इसे सक्षम करने के लिए एक संदर्भ रैपर प्रकार है। यह एक संदर्भ में पूरी तरह से परिवर्तनीय है और यह मानक कंटेनरों में टिकाऊ है।

+1

आपके उत्तर से लिंक करें: http://en.cppreference.com/w/cpp/utility/functional/reference_wrapper – leon22

1

कंटेनर स्टोर वस्तुओं और संदर्भ वस्तुएं नहीं हैं। यदि आप सी ++ 11 पर हैं, तो आप असाइन करने योग्य ऑब्जेक्ट्स को चीजों को लपेटने के लिए std :: context_wrapper का उपयोग कर सकते हैं।

http://en.cppreference.com/w/cpp/utility/functional/reference_wrapper

std :: reference_wrapper कि एक copyable, आबंटित वस्तु में एक संदर्भ लपेटता एक वर्ग टेम्पलेट है। इसे अक्सर मानक कंटेनर (जैसे std :: वेक्टर) के संदर्भों को संग्रहीत करने के लिए एक तंत्र के रूप में प्रयोग किया जाता है जो सामान्य रूप से संदर्भ नहीं रख सकता है।

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