2011-11-01 14 views
21

द्वारा वेक्टर पास करना यदि मेरे पास एक वर्ग में ऑब्जेक्ट्स का वेक्टर है जिसे मैं दूसरे में बदलना चाहता हूं, तो मैं संदर्भ से सभी जानकारी को आज़माकर पास कर दूंगा।संदर्भ

हालांकि मुझे संदर्भ द्वारा पास करने की क्या ज़रूरत है? वेक्टर? वस्तुओं? दोनों?

अनिवार्य रूप से मैं जो पूछ रहा हूं वह है: इनके बीच क्या अंतर है?

vector&<object> blah; // A reference to a vector of objects? 

vector<object&> blah; // A vector of references to objects? 

vector&<object&> blah; // A reference to a vector of references to objects??? 

मैं वास्तव में यकीन है कि कंटेनर काम की तरह सरणी के कैसे को संदर्भित नहीं कर रहा हूँ। क्या ये कानूनी हैं?

+0

आपको वास्तव में बदलने की क्या ज़रूरत है? यदि आपको एक ऑब्जेक्ट को बदलने की ज़रूरत है, तो आप इसे संदर्भ से पास कर देते हैं। यदि आपको कंटेनर को बदलने की आवश्यकता है (उदा।, ऑब्जेक्ट जोड़ें या हटाएं), तो आप कंटेनर पास करते हैं। – Vlad

+0

और संदर्भ सही ढंग से 'वेक्टर & blah; ' – Vlad

+3

के रूप में लिखा गया है, मैं [एक अच्छी प्रारंभिक सी ++ पुस्तक] (http://stackoverflow.com/q/388242/46642) की सिफारिश करूंगा। –

उत्तर

41

vector&<object> एक वाक्यविन्यास त्रुटि है। vector<object&> अमान्य है, क्योंकि एक वेक्टर का मान प्रकार असाइन करने योग्य होना चाहिए। vector&<object&> blah एक वाक्यविन्यास त्रुटि है।

एक वेक्टर का संदर्भ vector<T>& है।

+0

ठीक है तो आप बस एक वेक्टर के संदर्भ को संग्रहीत करते हैं ... और जब इंडेक्स द्वारा कहा गया वेक्टर के तत्व को एक्सेस करते समय आप वास्तव में मूल ऑब्जेक्ट तक पहुंच रहे हैं? – SirYakalot

4

आपके पास संदर्भों का वेक्टर नहीं हो सकता है। वेक्टर तत्व कॉपी करने योग्य और असाइन करने योग्य होना चाहिए, जो संदर्भ नहीं हैं। तो केवल पहला विकल्प वास्तव में एक विकल्प है, लेकिन यह std::vector<Object> & वर्तनी है।

ध्यान दें कि v[1] पहले से ही संदर्भ दूसरे तत्व पर लौटाता है, ताकि आप खुशी से व्यक्तिगत तत्वों को संदर्भित कर सकें।

संदर्भ-रैपर का एक वेक्टर एक ला std::ref होना संभव है, लेकिन यदि आपको नहीं पता कि यह क्या है, तो शायद आपको इस बिंदु पर इसका उपयोग नहीं करना चाहिए।

2

एक और विकल्प कंटेनर के बजाय iterators पास करना है। यह दृष्टिकोण standard library<algorithm> में आता है। वे कॉलिंग साइट पर थोड़ी अधिक वर्बोज़ हैं, लेकिन उनके पास यह लाभ है कि वे संग्रह के कुछ हिस्सों के साथ-साथ पूर्ण संग्रह के लिए काम करते हैं और कंटेनर से एल्गोरिदम को डीक्यूल्स करते हैं।

आखिरकार, यह जांचने के लायक है कि आप अपने algorithms को जानते हैं क्योंकि पहले से ही ऐसा हो सकता है जो आप चाहते हैं।

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