'size_t' बनाम 'कंटेनर :: size_type'


108

वहाँ size_tऔर के बीच एक अंतर है container::size_type?

जो मैं समझता हूं size_tवह अधिक सामान्य है और किसी भी size_typeएस के लिए इस्तेमाल किया जा सकता है ।

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

जवाबों:


108

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

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


2
क्या आप इस उत्तर को स्पष्ट कर सकते हैं? मैं वापस दूर के रूप में के रूप में मसौदा मानकों ओर मुड़कर देखा है N1804और मैं अपने बीच के संबंध नहीं दिख रहा है Allocator::size_typeऔर size_type। Libstdc ++ पर एक त्वरित नज़र या तो इसके समान कुछ भी नहीं दिखाती है।
शाफिक याघमोर

1
@ शफीकगहमौर, इसलिए यह उत्तर थोड़ा पुराना है, लेकिन अधिकतम पोर्टेबिलिटी के लिए मुझे लगता है कि सलाह अभी भी ध्वनि है: सी ++ 03 निर्दिष्ट "तालिका 32: size_type: एक प्रकार जो आवंटन मॉडल में सबसे बड़ी वस्तु के आकार का प्रतिनिधित्व कर सकता है।" उस समय, size_tउन बाधाओं का व्यावहारिक व्यावहारिक कार्यान्वयन था। हालाँकि, C ++ 11 में, अब इसे अनिवार्य रूप से परिभाषित किया गया है: std::make_unsigned<X::difference_type>::typeडिफ़ॉल्ट रूप से। व्यवहार में जो, शायद एक ही या संगत होगा size_t
इवान टेरान

2
इस सवाल का जवाब गलत है .... देखें stackoverflow.com/questions/4849678/… TL: DR: एलोकेशनर्स size_type को size_t होना चाहिए और C ++ में 17 size_type के रूप में पदावनत किया जाएगा।
user3063349

1
@ user3063349 मुझे उस पृष्ठ में कुछ भी नहीं दिख रहा है, न ही सी ++ 2017 स्टैंडर्ड (23.10.8) में, पदावनति पर संकेत करने के लिए size_type। क्या देता है?
मार्क.2377

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

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

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


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

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

2
"सभी एसटीडी कंटेनर size_t का उपयोग size_type के रूप में करते हैं" बहुत ही गलत और भ्रामक। हां, वे USUALLY करते हैं (कम से कम मेरे सभी कंपाइलरों ने ऐसा ही किया) लेकिन C ++ भाषा का संदर्भ यह नहीं बताता है कि इसे सभी stl कंटेनर के लिए समान होने की आवश्यकता है !! इतनी देखभाल
user3063349


8

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

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.