2015-03-10 5 views
6

बस एहसास हुआ कि std::count_ifreturns a signed valuestd :: count_if हस्ताक्षरित हस्ताक्षर के बजाय हस्ताक्षरित मूल्य क्यों करता है?

इस तरह से डिज़ाइन क्यों किया गया है? यह दोनों मेरी राय में कोई अर्थ नहीं है (नतीजा केवल एक प्राकृतिक संख्या, यानी गैर-ऋणात्मक पूर्णांक हो सकता है), क्योंकि यह किसी भी चेतावनी या उपयोग किए बिना कंटेनर के size() पर इस परिणाम की तुलना करने के रूप में सरल कुछ करने की अनुमति नहीं देता है स्पष्ट प्रकार रूपांतरण।

मुझे सच में लगता है कि वापसी प्रकार size_type होना चाहिए।

क्या मुझे कुछ याद आ रही है?

+0

यह 'गिनती' के लिए इटरेटर के 'अंतर_ प्रकार' को वापस करने के लिए कुछ समझ में आता है, क्योंकि यह तर्कों का अंतर बहुत अधिक है, यह 'इंटरफ़ेस' को 'count_if' के लिए रखने के लिए समझ में आता है, और यह समान रूप से कुछ बनाता है बिडरेक्शनल इटरेटर्स के लिए 'difference_type' पर हस्ताक्षर किए जाने के लिए अर्थ। – BoBTFish

+0

इसी प्रकार एक निरंतर समय में दो 'std :: list' क्यों विभाजित नहीं कर सकता? –

+1

@WojciechFrohmberg: सरल, आपको तत्वों की गणना करने की आवश्यकता है। एक बार बनाई गई सूची में ओ (1) '.size() 'है जिसका अर्थ यह है कि यह कैश किया गया है, – MSalters

उत्तर

2

मुझे लगता है कि वापसी का प्रकार std::count पर संगत होना है जो दो इटरेटर (पॉइंटर्स के बारे में सोचें) लेता है और मानों को वापस देता है (जिसे आप दो पॉइंटर्स के अंतर के रूप में सोच सकते हैं)। एक सूचक अंतर (जैसा कि ptrdiff_t में उपयोग किया जाता है) को एक हस्ताक्षरित मूल्य होना चाहिए।

std::count की संगतता के लिए धन्यवाद आप आसानी से इन दो कार्यों के परिणामों की तुलना कर सकते हैं।

संपादित करें: यहां एक हस्ताक्षरित मूल्य का उपयोग करके कोई श्रेणी संबंधित दोष नहीं है, क्योंकि मान कम से कम [0, std::count] श्रेणी में होगा जो स्वयं [0, end_ptr - start_ptr] श्रेणी में होगा। क्योंकि end_ptr - start_ptr को ptrdiff_t या इसी तरह के रूप में टाइप किया गया है, यह हस्ताक्षरित है।

+3

बकवास। 'Std :: count' विवरण स्पष्ट रूप से कहता है:" सीमाओं के बराबर तुलना करें [पहले, आखिरी) श्रेणी में ** तत्वों की संख्या ** लौटाता है। " तत्वों की संख्या नकारात्मक नहीं हो सकती है। 'गिनती' तर्क (इटरेटर) का प्रकार पूरी तरह से असंबंधित है। –

+0

@ व्हायोलेट जिराफ: हाँ। तत्वों की संख्या नकारात्मक नहीं हो सकती है। लेकिन 'गिनती' और 'count_if' के हस्ताक्षर दोनों में इटरेटर शामिल हैं। मैंने यह नहीं कहा कि हस्ताक्षर किए गए कई तत्वों को परिभाषित करने के लिए यह बहुत समझदारी है ... – urzeit

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