2011-08-18 9 views
7

मैं इन दिनों एसटीएल सीख रहा हूँ और मैं सोच रहा था संदर्भ द्वारा यदि एसटीएल कंटेनर वापसी?क्या सभी एसटीएल कंटेनर संदर्भ के आधार पर अपने तत्व लौटते हैं?

उदाहरण के लिए:

vector.first(); 
map[key]; 
*vector.begin(); 
Or any possible return that ends with element (or value type) of container 

उदाहरण के लिए:

std::vector<int> elements; 
elements.push_back(20); 
elements[0]=60; // this will also change the value 
elements.front() = 23; // even the functions also behave same way like subscript operator 

यह सब कंटेनरों के साथ मामला है? या ऐसे कुछ मुद्दे हैं जिन पर मैंने नहीं दिखाया था?

+0

"उदाहरण के लिए"? आपको क्या लगता है "उदा।" माध्यम? यदि विदेशी शब्द भ्रमित हैं, तो "उदाहरण के लिए" और "एक और उदाहरण" में क्यों न केवल अंग्रेजी का उपयोग करें? –

+0

मुझे प्रश्न बहुत अस्पष्ट लगता है। "यदि सभी एसटीएल कंटेनर संदर्भ द्वारा वापस आते हैं" - इसका क्या मतलब है? सबसे पहले, आपको शायद "मानक पुस्तकालय कंटेनर" कहना चाहिए। दूसरा, कौन लौट रहा है? क्या आपके पास सदस्य कार्यों का एक विशिष्ट सेट दिमाग में है? या आप सदस्य कार्यों के बारे में पूछ रहे हैं जो * संदर्भ द्वारा वापस नहीं आते हैं? ('Pop_back()' की तरह?) –

+0

@ केरेक: मैंने उदा। "उदाहरण के लिए" के रूप में अनावश्यक था। भावी आगंतुकों के लिए: http://ancienthistory.about.com/od/abbreviations/f/ievseg.htm –

उत्तर

13

जोड़ा तत्व या कंटेनर सदस्य कार्यों में कंटेनर रिटर्निंग एक सुरक्षित तरीका में संभव नहीं है। एसटीएल कंटेनर ज्यादातर "मजबूत गारंटी" प्रदान करते हैं। छेड़छाड़ किए गए तत्व या कंटेनर को लौटने से मजबूत गारंटी प्रदान करना असंभव हो जाएगा (यह केवल "मूल गारंटी" प्रदान करेगा)। Exception-Safety in Generic Components पर बूस्ट की वेबसाइट पर इन शर्तों का एक स्पष्टीकरण प्रदान किया गया है। Boost's website से नीचे देखें।

  • बुनियादी गारंटी: कि घटक के अपरिवर्तनशीलताओं संरक्षित कर रहे हैं, और कोई संसाधन लीक कर रहे हैं।
  • मजबूत गारंटी: किया है कि आपरेशन या तो सफलतापूर्वक पूरा कर लिया या एक अपवाद फेंका, कार्यक्रम राज्य बिल्कुल के रूप में यह पहले था आपरेशन शुरू कर दिया हो जाता है।
  • नहीं फेंक गारंटी: कि आपरेशन एक अपवाद फेंक नहीं होंगे।

विषय पर वापस इस previous SO answer के अनुसार, इसके पीछे कारण यह है, कि कुछ लौटने संभवतः एक कॉपी-निर्माता है, जो एक अपवाद फेंक कर सकते हैं आह्वान सकता। लेकिन समारोह पहले से ही बाहर निकला है, इसलिए यह अपने मुख्य कार्य को सफलतापूर्वक पूरा कर चुका है, लेकिन फिर भी एक अपवाद फेंक दिया, जो मजबूत गारंटी का उल्लंघन है। आप शायद सोचें: "ठीक है तो संदर्भ द्वारा वापस आते हैं!", जबकि यह एक अच्छा समाधान की तरह लगता है, यह पूरी तरह से सुरक्षित नहीं है। उदाहरण निम्नलिखित पर विचार करें:

MyClass bar = myvector.push_back(functionReturningMyClass()); // imagine push_back returns MyClass& 

फिर भी, यदि कॉपी-असाइनमेंट ऑपरेटर फेंकता है, हम अगर push_back सफल रहा या नहीं, इस प्रकार परोक्ष रूप से मजबूत गारंटी का उल्लंघन पता नहीं है। भले ही यह प्रत्यक्ष उल्लंघन नहीं है। बेशक MyClass& bar = //... बजाय का उपयोग कर इस समस्या को हल होगा, लेकिन यह काफी असुविधाजनक हो सकता है, कि एक कंटेनर एक अनिश्चित स्थिति में मिल सकता है, सिर्फ इसलिए कि किसी को एक & भूल गया।

इस तथ्य के पीछे एक समान तर्क है कि std::stack::pop() पॉप किए गए मान को वापस नहीं करता है। इसके बजाय top() शीर्षतम मूल्य को सुरक्षित तरीके से लौटाता है। शीर्ष पर कॉल करने के बाद, जब एक कॉपी-कन्स्ट्रक्टर, या एक कॉपी-असाइनमेंट कन्स्ट्रक्टर फेंकता है, तब भी आप जानते हैं कि स्टैक अपरिवर्तित है।

+0

मैं मजबूत गारंटी के बारे में कुछ नहीं पता :(मैं अगर तुम सरल शब्दों में इस संपत्ति के बारे में कुछ और समझा सकता है अच्छा लगेगा, धन्यवाद –

+1

@ Mr.Anubis: मेरे संपादन देखें –

2

सभी प्रकार कंटेनरों (अनुक्रम, सहयोगी) के एक सतत इंटरफेस (जहां संभव हो) प्रदान करने के लिए डिज़ाइन किए गए हैं। यह उन्हें अपेक्षाकृत आसान सीखता है और उन्हें तब तक आसान बनाता है जब तक आप उन्हें सही तरीके से सीखा है!))

तो उदाहरण के लिए, operator[] सभी कंटेनर के लिए अनुक्रमित इकाई के संदर्भ में वापस आ जाएगा (मामले में सहयोगी कंटेनर, यह पहले बनाया जाएगा)। अनुक्रम कंटेनरों के लिए यह सीमाओं की जांच के बारे में एक दिलचस्प बिंदु उठाता है - लेकिन यह एक अलग कहानी है। इसी प्रकार, यदि आप कोई अन्य आम ऑपरेशन लेते हैं (insert इत्यादि) में एक समान इंटरफ़ेस होगा। आपका पसंदीदा संदर्भ आमतौर पर आपको आवश्यक सारी जानकारी प्रदान करेगा।

2

हां ओवरलोडेड [] एसटीएल कंटेनर के लिए ऑपरेटर एक संदर्भ देता है। तो m और elements में मानों के ऊपर आपके उदाहरणों में बदला जाएगा।

http://www.cplusplus.com/reference/stl/vector/operator%5B%5D/ से

:

परिभाषा या ऑपरेटर [] के लिए वेक्टर है:

reference operator[] (size_type n); 
const_reference operator[] (size_type n) const; 

कहाँ 'सदस्य प्रकार reference और const_reference वेक्टर कंटेनर के तत्वों (आम तौर पर के रूप में परिभाषित करने के लिए संदर्भ प्रकार के होते हैं अधिकांश भंडारण आवंटन मॉडल में क्रमश: T& और const T&)। '

संपादित करें: इस बात से अवगत रहें कि सभी एसटीएल कंटेनरों में ओवरलोडेड [] ऑपरेटर नहीं है। जो नहीं हैं: list, multimap, multiset, priority_queue, queue, set और stack

+1

यह भी ध्यान दें कि महत्वपूर्ण हो सकता है। 'std :: map' के' ऑपरेटर [] 'में 'const' अधिभार नहीं है क्योंकि यदि कुंजी पहले से मौजूद नहीं है तो उसे मानचित्र में डालना होगा।' map :: find' का उपयोग करें यदि 'const'ness है की आवश्यकता है। नहीं –

+0

valarrays साथ पूरी तरह सच। गैर स्थिरांक संस्करण के लिए एक संदर्भ है, जबकि स्थिरांक संस्करण एक प्रति रिटर्न देता है,। – wxffles

1

std::vector<bool> को बूल के संदर्भ से कुछ और लौटने की अनुमति है (मान लीजिए कि आप वास्तव में मानक लाइब्रेरी का मतलब है, एसजीआई एसटीएल नहीं)। लेकिन इसे आम तौर पर एक गलती के रूप में भी देखा जाता है जो कंटेनर कहलाता नहीं है।

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