2016-04-20 5 views
7

का उपयोग करने के बजाय "टाइपपीफ वेक्टर :: size_type" का उपयोग क्यों किया है, मैं केवल सी ++ सीख रहा हूं और मैं त्वरित सी ++ का उपयोग कर रहा हूं। उन्होंने "int"

एक वेक्टर उदाहरण में, लेखक ने निम्नलिखित कोड का उपयोग किया;

typedef vector<double>::size_type vec_sz; 
vec_sz size = homework.size; 

मैं जानता हूँ कि typedef vector<double>::size_type vec_sz; है इतना है कि वह vector<double>::size_type size = homework.size; के रूप में अगले आदेश लिखने के लिए नहीं है, लेकिन मेरे सवाल क्यों वह सिर्फ size बजाय एक पूर्णांक के रूप में घोषित नहीं किया है?

int size = homework.size; 

क्या ऐसा इसलिए है क्योंकि हम एक वेक्टर का उपयोग कर रहे हैं?

यदि ऐसा है, तो इसका मतलब यह है कि वेक्टर इटरेटर्स द्वारा लौटाए गए मान नियमित चर में संग्रहीत नहीं किए जा सकते हैं?

+1

यहां आपके लिए एक प्रश्न है: 'वेक्टर :: size_type' के पीछे क्या प्रकार है? –

+1

संक्षिप्त उत्तर यह है कि लेखक शायद 'size_t' का उपयोग कर सकता था, लेकिन यह * 'int' जैसा नहीं है (यह * आमतौर पर * या तो 'हस्ताक्षरित int' या 'हस्ताक्षरित लंबा' जैसा ही होता है; इसके बारे में हस्ताक्षर एक बहुत बड़ा सौदा है और आकार अंतर भी आप जो कर रहे हैं उसके आधार पर भी मायने रख सकते हैं)। वास्तविक उत्तर बॉक्स के लिए भी लंबा जवाब बहुत लंबा है; एक _good_ सी ++ पुस्तक वास्तव में बताएगी कि 'int' बनाम' size_t' बनाम 'कंटेनर :: size_type' के साथ सौदा क्या है, लेकिन ऐसा लगता है जैसे आपका नहीं था। – zwol

+1

बिंदु यह है कि हम नहीं जानते कि 'std :: vector :: size_type' के पीछे वास्तव में किस प्रकार का है, लेकिन जो भी प्रकार है, हम इसे घोषित करने का एक छोटा सा तरीका चाहते हैं। यह 'int' बीटीडब्ल्यू होने की संभावना नहीं है। हम जानते हैं कि यह एक ऐसा प्रकार है जो * वेक्टर * में तत्वों की अधिकतम संख्या को संबोधित करने के लिए पर्याप्त संख्या में हो सकता है। – Galik

उत्तर

6

उन्होंने आकार को पूर्णांक के रूप में क्यों घोषित नहीं किया?

क्योंकि पूर्णांक दो कारणों के लिए, वेक्टर के आकार स्टोर करने के लिए सही प्रकार नहीं है:

  • int नकारात्मक होने की अनुमति है; एक वेक्टर के आकार गैर नकारात्मक
  • है यहां तक ​​कि एक अहस्ताक्षरित int इतना बड़ा नहीं हो सकता है अधिक से अधिक वेक्टर आकार

int छोटे वैक्टर के लिए ठीक काम करेगा धारण करने के लिए, लेकिन एक सामान्य दृष्टिकोण के लिए आप vector<T>::size_type उपयोग करना चाहिए। ध्यान दें कि प्रकार हस्ताक्षरित है, इसलिए आपको इंडेक्स द्वारा आगे की ओर इशारा करते समय सावधान रहना होगा।

क्या इसका मतलब यह है कि वेक्टर इटरेटर्स द्वारा लौटाए गए मान नियमित चर में संग्रहीत नहीं किए जा सकते हैं?

इटरेटर vector<T>::size_type प्रकार नहीं हैं, यह अलग डेटा प्रकार पूरी तरह से है।

+0

तो संक्षेप में हम size_type का उपयोग कर रहे हैं क्योंकि यह एक बड़ा आकार धारण करने में सक्षम होगा कि एक हस्ताक्षरित int होगा? अगर मैं आपका जवाब सही ढंग से पढ़ रहा हूं। –

+1

@OlaniyiJinadu हां, यह अनिवार्य रूप से बात है। यदि आप वेक्टर के टाइपपीफ का उपयोग करते हैं, तो आपको चिंता करने की ज़रूरत नहीं है कि सूचकांक फिट होने जा रहा है या नहीं। – dasblinkenlight

5

सबसे पहले, std::vector::size_typeint नहीं है।

अहस्ताक्षरित अभिन्न प्रकार (आमतौर पर std::size_t)

और

std::size_tsizeof ऑपरेटर के परिणाम की अहस्ताक्षरित पूर्णांक प्रकार के साथ-साथ sizeof... ऑपरेटर और alignof ऑपरेटर (है सी ++ 11 के बाद से)।

दूसरे, ग 11 ++ से आप auto specifier का उपयोग स्वचालित रूप से प्रकार अनुमान कर सकते हैं।

auto size = homework.size(); 

Btw: homework.size अजीब लगता है, आप homework.size() मतलब हो सकता है।

+0

हां। मेरा मतलब था 'होमवर्क.size() '। lol –