2010-03-03 14 views
11

मैं एक vector<set<char> > डेटा संरचना (लेनदेन डेटाबेस) है और मैं इसके बारे में आकार जानना चाहते हैं। जब मैं प्रत्येक set<char> के साथ sizeof() का उपयोग करता हूं तो सेट के बावजूद आकार 24, 4 या 5 वर्ण होते हैं। बाद में, जब मैं vector<set<char> > के साथ आकार() का उपयोग करता हूं तो आकार 12 है ... मुझे लगता है कि यह डेटा संरचना के आकार को जानने का तरीका नहीं है। कोई मदद? धन्यवाद।sizeof() एक वेक्टर

+8

sizeof() एक संकलन समय ऑपरेटर –

उत्तर

18

आप vector::size() और set::size() चाहते हैं।

मान लिया जाये कि v अपने वेक्टर है, ऐसा करते हैं:

size_t size = 0; 
for (vector<set<char> >::const_iterator cit = v.begin(); cit != v.end(); ++cit) { 
    size += cit->size(); 
} 

sizeof() आप वस्तु के नि: स्मृति आकार दे रहा है/टाइप यह sizeof(char) (आमतौर पर एक बाइट) के गुणकों में करने के लिए लागू होता है। आप कंटेनर और उसके तत्वों के नि: स्मृति आकार में जानना चाहते हैं, तो आप ऐसा कर सकते हैं:

sizeof(v) + sizeof(T) * v.capacity(); // where T is the element type

+0

क्या होगा अगर वह पहले से ही उसके वेक्टर आरक्षित करा लिया है? –

+1

@ जॉन: क्या होगा यदि उसके पास * है? 'रिजर्व()' के पास * आकार() 'के साथ कुछ भी नहीं है। –

+0

मुझे लगता है कि जॉन का मतलब है कि यदि आप कुछ विचार करना चाहते हैं कि वेक्टर (और सामग्री) कितनी मेमोरी पर कब्जा कर लेता है, तो आपको क्षमता को नहीं देखना चाहिए, आकार नहीं। "कंटेनर और इसके तत्वों के स्मृति में" निश्चित रूप से संदिग्ध है, लेकिन मुझे संदेह है कि वे वर्तमान में तत्वों द्वारा कब्जा कर लिया गया स्मृति की मात्रा के बजाय वेक्टर द्वारा आवंटित स्मृति की मात्रा से संबंधित समझा जा सकता है। कोड के लिए –

2

sizeof() संकलन समय पर की जाती है, इसलिए वहाँ कोई रास्ता नहीं यह आपको बता कितने तत्वों सकता है इसमें अंदर है

वेक्टर वस्तु की size() विधि का उपयोग करें। वस्तु के ही

7

sizeof रिटर्न आकार। अगर यह सरणी उदाहरण के लिए यह सरणी के आकार को नहीं गिना जाएगा करने के लिए सूचक होता है, यह वेक्टर में आइटमों की संख्या पता लगाने के लिए केवल वेक्टर उपयोग के लिए .size

0

उपयोग vector::size() सदस्य समारोह (32 बिट पर 4) सूचक के आकार की गणना होती है । संकेत - वे मुफ्त स्टोर पर आवंटित किए जाते हैं।

5

वेक्टर वास्तविक स्टोरेज में आंतरिक पॉइंटर्स का उपयोग करके कार्यान्वित किया जाता है। इसलिए आकार() हमेशा एक ही परिणाम लौटाएगा जिसमें डेटा संग्रहण स्वयं शामिल नहीं है। इसके बजाय vector::size() विधि का उपयोग करने का प्रयास करें। यह वेक्टर में तत्वों की संख्या वापस कर देगा।

1

एसटीएल में vector जब आप वेक्टर निम्नलिखित <SomeType> अंदर टेम्पलेट पैरामीटर देना एक वर्ग टेम्पलेट है,, सी ++ संकलक प्रकार SomeType के एक वर्ग के लिए कोड उत्पन्न। तो जब आप push_back प्रयोग करके वेक्टर पॉप्युलेट, आप वास्तव में SomeType का एक और वस्तु डालने रहे हैं ताकि आप संकलक से .size() का अनुरोध करते हैं तो यह आपको SomeType वस्तुओं आप द्वारा सम्मिलित की संख्या देता है।
आशा है कि मदद करता है!

+1

का आकार ठीक है कि यह एक आसपास का जवाब है ... किसने कहा कि वह 'push_back' का उपयोग कर रहा है और यह कैसे प्रासंगिक है? तथ्य यह है कि वेक्टर एक टेम्पलेट प्रासंगिक है? लेकिन कम से कम आपको यह मुद्दा मिला कि 'आकार()' ओपी क्या ढूंढ रहा है। –

+1

@STingRaySC मैं ओपी को समझाने की कोशिश कर रहा था कि आकार के पास वह (/ वह) चाहता था उससे कोई लेना देना नहीं है। यह .size() विधि है जिसे वह (/ वह) ढूंढना चाहिए। –