2012-09-24 14 views
12

संभव डुप्लिकेट:
Why does the C++ standard algorithm “count” return a ptrdiff_t instead of size_t?क्यों std :: count (_if) iterator वापस करें :: size_tpe size_t के बजाय?

वहाँ एल्गोरिथ्म std::count/std::count_if मानक C++ है।

template<class InputIterator, class T> 
typename iterator_traits<InputIterator>::difference_type 
count(InputIterator first, InputIterator last, const T& value); 

template<class InputIterator, class Predicate> 
typename iterator_traits<InputIterator>::difference_type 
count_if(InputIterator first, InputIterator last, Predicate pred); 

प्रभाव: iterators की संख्या देता है मैं सीमा [प्रथम, अंतिम) जिसके लिए निम्नलिखित इसी की स्थिति पकड़ में: * मैं == मूल्य, pred (* i) = झूठी!।

difference_typeiterator's difference_type, जो नकारात्मक हो सकता है, लेकिन count केवल मूल्य लौट सकते हैं> = 0. क्यों difference_type और उदाहरण के लिए नहीं size_t?

उत्तर

12

सिद्धांत में आपके पास एक जबरदस्त अनुक्रम हो सकता है जिसका तत्व केवल 128 बिट्स के साथ प्रदर्शित किया जा सकता है। कार्यान्वयन मानते हुए एक पूर्ण पूर्णांक प्रकार का समर्थन करता है, यह काफी संभावना है कि size_t 64 बिट प्रकार का उपयोग करें। हालांकि, इस विशाल अनुक्रम के लिए इटरेटर 128 बिट पूर्णांक का उपयोग कर सकता है। ध्यान दें, अनुक्रम किसी भी व्यक्तिगत कंप्यूटर की स्मृति में आवश्यक नहीं है। इसे कई विशाल डेटाबेस में विभाजित किया जा सकता है।

आपके पास अपेक्षाकृत छोटा कंप्यूटर भी उचित प्रदर्शन के साथ केवल 32 बिट प्रकार का समर्थन कर सकता है। पूर्ण मानक अनुरूपता के लिए इसे 64 बिट प्रकार का समर्थन करना पड़ सकता है लेकिन प्लेटफ़ॉर्म द्वारा समर्थित रूप से समर्थित प्रतिनिधित्व का उपयोग करके तेज़ गणनाओं का समर्थन करना वांछनीय हो सकता है। यही है, size_t इष्टतम विकल्प नहीं हो सकता है। इटरेटर बनाने के दौरान आप आम तौर पर जानते हैं कि किस आकार को समर्थित करने की आवश्यकता है।

+0

धन्यवाद, महान स्पष्टीकरण। – ForEveR

+1

@DietmarKuehl लेकिन 'iterator_traits <इनपुट Iterator> :: difference_type' क्यों बेहतर विकल्प है? यह ज्यादातर मामलों में एक 8-बाइट-हस्ताक्षरित पूर्णांक है, जो पहले से ही तर्क को तोड़ देता है कि 'size_t' (8-बाइट-हस्ताक्षरित पूर्णांक) काफी बड़ा नहीं हो सकता है! –

+2

@GrimFandango: अन्य iterators के लिए किए गए विकल्पों को 'TremendousIterator :: difference_type' की अपनी पसंद को कैसे प्रभावित करता है? मुद्दा यह है कि 'std :: size_t' का उपयोग करके विशेष मामलों को विशेष विकल्पों का उपयोग करने के लिए नेस्टेड प्रकार का उपयोग करते समय उपयुक्त विकल्प बनाने की अनुमति मिलती है। –