2010-06-17 9 views
22

सी ++ में, string::find क्यों size_type लौटाता है और iterator नहीं?स्ट्रिंग :: क्यों वापसी आकार_ प्रकार ढूंढें और एक पुनरावर्तक नहीं है?

यह मतलब होगा क्योंकि string::replace या string::insert की तरह काम करता है, इनपुट के रूप में iterators ले ताकि आप कुछ चरित्र आदि find और तुरंत replace को लौट इटरेटर गुजरती हैं,

भी कर सकता है, std::find पुनरावर्तक रिटर्न - क्यों है std::string::find अलग?

उत्तर

5

शायद यह संख्या खोजने के लिए अधिक उपयोगी है क्योंकि आप [] ऑपरेटर या substr() का उपयोग कर सकते हैं जिनके लिए अभी खोज रहे हैं।

इसके अलावा, अगर आप एक इटरेटर चाहते हैं, तो आप हमेशा begin() + pos

+3

तो आप कह रहे हैं कि 'स्ट्रिंग :: खोज' का बुरा इंटरफ़ेस वास्तव में अच्छा है क्योंकि यह' string :: substr' के खराब इंटरफ़ेस के साथ अच्छी तरह से इंटरैक्ट करता है? ;) – Praxeolitic

+0

मैं इसे इटरेटर्स के साथ गड़बड़ नहीं करना चाहूंगा जब मैं चाहता हूं कि स्ट्रिंग – shoosh

+0

जैसे पहले दो अक्षर प्राप्त करें: प्रारंभ करें() + pos – fchen

0

मुझे लगता है यह क्योंकि सामान्य स्ट्रिंग सदस्यों में iterators बजाय अनुक्रमित पर काम है क्या कर सकते हैं और इस आसान दिए गए मान का उपयोग करने में आता है। यदि आप एक इटेटरेटर प्राप्त करना चाहते हैं तो आप हमेशा std::find का उपयोग कर सकते हैं।

+0

मैं बस कहना चाहता था कि 'std :: vector' इंडेक्स पर मूल रूप से भी काम करता है और जब आप कुछ खोजते हैं तो size_type वापस नहीं आता है - लेकिन तब मुझे याद आया कि वेक्टर को बिल्कुल नहीं मिला है()। आपको आश्चर्य है कि क्यों 'स्ट्रिंग' है ... – Frank

+1

@ डेहमान: यह ऐतिहासिक कारणों से है। 'std :: string' पहले था (फिर' std :: basic_string') और उसके बाद एसटीएल अपने इटरेटर के साथ आया। जब मानक में एसटीएल को शामिल करने का निर्णय लिया गया था, तो इसे वास्तव में अंतिम रूप देने के करीब माना जाता था। (एसटीएल के निगमन ने इसे लगभग एक साल तक देरी कर दी।) वास्तव में उपयोग में पहले से ही 'std :: basic_string' के कार्यान्वयन थे। तो परिवर्तन न्यूनतम रखा गया था और ज्यादातर केवल जोड़ों को रखा गया था। – sbi

25

मानक लाइब्रेरी की चमकदार नई स्ट्रिंग क्लास का डिज़ाइन पहले से ही किया गया था जब स्ट्रॉस्ट्रप ने एसटीएल को मानक समिति की शुरुआत की थी। समिति ने एसटीएल को पसंद किया और इसे मानक में शामिल करना शुरू किया, जिससे वे पहले से ही सहमत हो गए थे (और शायद दूसरे वर्ष या दो के लिए मानक में भी देरी कर रहे थे)।

अन्य परिवर्तनों के अलावा, इटेटर को पहले से तैयार स्ट्रिंग क्लास में बाद में विचार के रूप में जोड़ा गया था। आप इसे देखकर/वापस लौटने वाले विभिन्न स्ट्रिंग सदस्यों को देखकर देख सकते हैं - यह इंडेक्स और इटरेटर्स का जंगली मिश्रण है।

यह अनुमान लगाना हमेशा आसान नहीं होता है कि क्यों कुछ सदस्य फ़ंक्शंस में केवल इंडेक्स लेने वाले संस्करण होते हैं और कुछ में इटेटरेटर लेने वाले भी होते हैं। std::basic_string<>::find() के मामले में, हालांकि, यह आसान लगता है: चूंकि std::find() पहले ही एक इटरेटर लौटाता है, std::basic_string<>::find() जैसा था।

+0

आपका अंतिम अनुच्छेद उलझन में है। क्या आपका मतलब है, यह बुनियादी_स्ट्रिंग <> :: ढूंढें() वापसी आकार_टाइप होना समझ में आता है क्योंकि std :: find() पहले से ही एक पुनरावर्तक लौटाता है और डिजाइनर इस व्यवहार को डुप्लिकेट नहीं करना चाहते हैं? क्या उन्हें समान बनाने, अनुरूपता में सुधार और लाइब्रेरी के उपयोग में आसानी नहीं होगी? – Frank

+0

@ डेहमान मूल रूप से, यदि आपको इटरेटर की आवश्यकता है std :: find(), यदि आपको इंडेक्स उपयोग की आवश्यकता है std :: basic_string <> :: find() –

+5

और 'स्ट्रिंग' खराब तरीके से डिज़ाइन किया गया है ... –

3

सभी स्ट्रिंग काम करता है, अनुक्रमित पर काम कुछ कार्यों (जैसे replace() और insert()) बस अतिरिक्त समर्थन iterators। तो find()का परिणाम का उपयोग सीधे उन कार्यों में किया जा सकता है। चूंकि वहां दो find() फ़ंक्शंस नहीं हो सकते हैं जो कि रिटर्न प्रकार से भिन्न होते हैं (एक इटेटरेटर लौटाता है, एक इंडेक्स लौटाता है) को चुना जाना था।

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