2012-11-14 15 views
13

दिया निम्नलिखित कोड:एक कॉन्स सरणी के आकार को कैसे जानें?

const myStr codesArr[] = {"AA","BB", "CC"};  

myStr एक वर्ग wraps char* है। मुझे सरणी में सभी वस्तुओं पर लूप करने की आवश्यकता है लेकिन मुझे आइटमों की संख्या पता नहीं है।

const int size = sizeof(codesArr)/sizeof(myStr); 

क्या करना है: मैं एक const मूल्य कि

यह की तरह कुछ प्रयोग सुरक्षित है (इस मामले 3 में) आकार का प्रतिनिधित्व करेंगी परिभाषित करने के लिए नहीं करना चाहते?

+2

के बाद से (एक और सरणी के आकार के रूप आपरेशन का परिणाम का उपयोग करने की अनुमति देता है इस सवाल ग या C++ है? ग के लिए है ++ मैं वास्तव में 'std :: array' (या' std :: tr1 :: array' का उपयोग करके अनुशंसा करता हूं यदि आपका कॉम पायलर सी ++ नहीं है 11) बिल्टिन सरणी के बजाय। और संभवतः 'mydtr' – Grizzly

+0

जो भी 'std :: string' का उपयोग कर रहा है वैकल्पिक रूप से आप ल्यूचियन ग्रिगोर द्वारा निर्दिष्ट प्रतिबंध के साथ' आकार (कोडएआरआर)/आकार (कोडएआरआर [0]) भी कर सकते हैं; –

उत्तर

16

आप int size = sizeof(codesArr)/sizeof(myStr); का उपयोग तब तक कर सकते हैं जब तक आप इसे किसी फ़ंक्शन के पैरामीटर के रूप में पास न करें, क्योंकि तब सरणी एक सूचक में क्षीण हो जाएगी और आकार की जानकारी खो जाएगी।

template<typename T, int sz> 
int size(T(&)[sz]) 
{ 
    return sz; 
} 
+0

आकार एक आकार_टी देता है, लेकिन हम सभी इसे int के साथ उपयोग करते हैं। क्या यह अंतर्निहित कलाकारों के कारण काम करता है? – Maroun

+1

@ Maroun85 हां, एक निहित रूपांतरण है (प्रति कलाकार नहीं)। इस रूपांतरण से किसी भी समस्या का कारण नहीं होगा जब तक आकार को int के रूप में प्रदर्शित किया जा सके। – nos

+1

आपका 'आकार()' फ़ंक्शन सी ++ 11 में 'constexpr' होना चाहिए, या सी ++ 03 में मैक्रो तकनीक का उपयोग करना चाहिए, ताकि इसे निरंतर अभिव्यक्ति के रूप में उपयोग किया जा सके। – Nawaz

28

इस (सी ++ 11 के बाद से) std::extent उपयोग करने के लिए है करने के लिए सुरक्षित और स्पष्ट रास्ता:

तुम भी एक टेम्पलेट चाल का उपयोग कर सकते

const size_t size = std::extent<decltype(codesArr)>::value; 
0

सबसे अच्छा तरीका है (पूर्व सी ++ 11) एक सरणी का आकार प्राप्त करने के लिए this link पर दिया गया है। यह घुलनशील टेम्पलेट चाल है, लेकिन उपरोक्त लिंक में चर्चा के अनुसार अन्य दृष्टिकोणों पर कई फायदे हैं। ,

template <typename T, size_t N> 
char (&_ArraySizeHelper(T (&array)[N]))[N]; 

#define countof(array) (sizeof(_ArraySizeHelper(array))) 

इसका लाभ, दूसरों के बीच में कर रहे हैं कि यह विशुद्ध रूप से एक संकलन समय आपरेशन, जो रन समय में यह कर की तुलना में बेहतर है, से पहले, और: विधि निम्न मैक्रो + फ़ंक्शन का उपयोग करने के लिए है C++ 11 के constexpr, एकमात्र तरीका है कि आप अपने एक संकलन समय निरंतर

+0

इसके बारे में इतना गड़बड़ क्या है? यह टेम्पलेट तर्क कटौती का एक सीधा उपयोग है। (यदि आप घुलनशील टेम्पलेट चाल चाहते हैं, तो बूस्ट स्रोतों में से कुछ देखें।) –

+3

(बेशक, यह तथ्य है कि आपके सटीक कोड में व्यवहार को अपरिभाषित किया गया है, क्योंकि इसमें एक प्रतीक है जो अंडरस्कोर के साथ शुरू होता है जिसके बाद पूंजी पत्र होता है।) –

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