2009-05-27 14 views
83

क्या size_t और container::size_type के बीच कोई अंतर है?'size_t' बनाम कंटेनर :: size_type '

मुझे क्या लगता है size_t अधिक सामान्य है और किसी भी size_type एस के लिए उपयोग किया जा सकता है।

लेकिन container::size_type विशिष्ट प्रकार के कंटेनर के लिए अनुकूलित है?

उत्तर

88

मानक कंटेनर Allocator::size_type करने के लिए एक typedef (संभाजक टेम्पलेट पैरामीटर है) है, जो std::allocator<T>::size_type के लिए आम तौर परsize_t होने के लिए परिभाषित किया गया है (या एक संगत प्रकार) के रूप में size_type परिभाषित करते हैं। तो मानक मामले के लिए, वे वही हैं।

हालांकि, यदि आप एक कस्टम आवंटक का उपयोग करते हैं तो एक अलग अंतर्निहित प्रकार का उपयोग किया जा सकता है। तो container::size_type अधिकतम सामान्यता के लिए बेहतर है।

+2

क्या आप इस उत्तर को स्पष्ट कर सकते हैं? मैंने 'N1804' के रूप में ड्राफ्ट मानकों पर वापस देखा है और मुझे 'आवंटक :: आकार_ प्रकार' और' size_type' के बीच कोई संबंध नहीं दिख रहा है। LibstdC++ पर एक त्वरित नज़र इस तरह के कुछ भी नहीं दिखाता है। –

+1

@ShafikYaghmour, तो यह जवाब थोड़ा पुराना है, लेकिन पोर्टेबिलिटी को अधिकतम करने के लिए मुझे लगता है कि सलाह अभी भी अच्छी है: सी ++ 03 निर्दिष्ट "तालिका 32: आकार_ प्रकार: एक प्रकार जो आवंटन मॉडल में सबसे बड़ी वस्तु के आकार का प्रतिनिधित्व कर सकता है। " उस समय, 'size_t' शर्त उन बाधाओं के व्यावहारिक कार्यान्वयन था। हालांकि, सी ++ 11 में, अब यह अनिवार्य रूप से परिभाषित किया गया है: डिफ़ॉल्ट रूप से 'std :: make_unsigned :: type'। जो अभ्यास में है, शायद 'size_t' के साथ समान या संगत होगा। –

+1

CARE उत्तर गलत है .... http: // stackoverflow देखें।कॉम/प्रश्न/4849678/सी-फॉर-लूप-आकार-प्रकार-बनाम-आकार-टी टीएल: डीआर: आवंटकों आकार_ प्रकार को आकार_टी होना चाहिए और सी ++ में 17 आकार_ प्रकार को बहिष्कृत किया जाएगा। – user3063349

8

std::[w]string, std::[w]string::size_typestd::allocator<T>::size_type के बराबर है, जो std::size_t के बराबर है। अन्य कंटेनर के लिए, यह कुछ कार्यान्वयन निर्दिष्ट हस्ताक्षर पूर्णांक प्रकार है।

कभी-कभी यह सटीक प्रकार के लिए उपयोगी होता है, उदाहरण के लिए कोई जानता है कि किस प्रकार के प्रकार के आसपास लपेटता है (जैसे, UINT_MAX) ताकि कोई इसका उपयोग कर सके। या टेम्पलेट्स के लिए, जहां आपको वास्तव में दो समान प्रकारों को फ़ंक्शन/क्लास टेम्पलेट्स को पास करने की आवश्यकता होती है।

अक्सर मुझे लगता है कि मैं ब्रेवटी या इटरेटर्स के लिए size_t का उपयोग करता हूं। जेनेरिक कोड में, चूंकि आप आमतौर पर नहीं जानते कि आपके कंटेनर का उपयोग किस कंटेनर इंस्टेंस का उपयोग किया जाता है और उन कंटेनरों का आकार क्या है, आपको कंटेनर आकार को स्टोर करने की आवश्यकता होने पर Container::size_type टाइपपीफ का उपयोग करना होगा।

32
  • size_t एक वस्तु के आकार के लिए इस्तेमाल किया प्रकार के रूप में परिभाषित किया और मंच निर्भर है।
  • container::size_type वह प्रकार है जो कंटेनर में तत्वों की संख्या के लिए उपयोग किया जाता है और कंटेनर निर्भर है।

सभी std कंटेनर size_type रूप size_t उपयोग करें, लेकिन प्रत्येक स्वतंत्र पुस्तकालय विक्रेता एक प्रकार है कि वह अपने कंटेनर के लिए उपयुक्त पाता है चुनता है।

यदि आप पर देखते हैं, तो आप पाएंगे कि size_type क्यूटी कंटेनर का संस्करण संस्करण निर्भर है। क्यूटी 3 में यह unsigned int था और क्यूटी 4 में इसे int में बदल दिया गया था।

+1

मुझे एक int के रूप में व्यक्त की गई चीज़ का आकार थोड़ा अजीब लगता है। क्या हमारे पास कभी कंटेनर के लिए नकारात्मक आकार हो सकता है? –

+8

@ मिहाई टोडोर: लोगों के लिए सब कुछ के लिए हस्ताक्षरित प्रकारों का उपयोग करना असामान्य नहीं है, मुझे लगता है कि क्यूटी सूट का पालन कर रहा है। इसका कारण यह है कि मिश्रित परिचालन (विशेष रूप से तुलना) ऐसे आपदा क्षेत्र हैं कि कई लोग मिश्रित ओप से निपटने और/या इससे निपटने के बजाय संख्याओं के लिए हस्ताक्षरित प्रकारों का उपयोग करने से बचेंगे। सिर्फ इसलिए कि हस्ताक्षरित प्रकार नकारात्मक संख्याओं को व्यक्त नहीं कर सकते हैं, इसका मतलब यह नहीं है कि आपके पास उन संख्याओं के लिए उपयोग करना है जो नकारात्मक नहीं हो सकते हैं :-) मैं स्वीकार करता हूं कि मुझे आश्चर्य है कि यह 'ssize_t' की बजाय' int' है, ' int' छोटा है। –

+0

@ स्टेव हां, आपके पास एक बिंदु है। धन्यवाद। –

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