2013-01-06 4 views
19

सी ++ 11 के unordered_map के डिफ़ॉल्ट निर्माता इस तरह दिखता है:अगर मैं सिर्फ हैश फ़ंक्शन निर्दिष्ट करना चाहता हूं तो मुझे unordered_map की बाल्टी गिनती तर्क को क्या पास करना चाहिए?

explicit unordered_map(size_type bucket_count = /*implementation-defined*/, 
        const hasher& hash = hasher(), 
        const key_equal& equal = key_equal(), 
        const allocator_type& alloc = allocator_type()); 

मैं एक कस्टम क़मी बनाने की मशीन समारोह के साथ एक unordered_map बनाना चाहते हैं, लेकिन यह निर्माता के लिए दूसरा तर्क है।

मुझे किस बाल्टी गिनती का उपयोग करना चाहिए? क्या कोई जादू मूल्य है जिसका उपयोग मैं कंटेनर को खुद के लिए तय करने के लिए कह सकता हूं? अन्यथा, क्या कोई उदारवादी है जिसका उपयोग मैं एक अच्छा बाल्टी नंबर guesstimate करने के लिए कर सकता हूं, जैसे कि मेरे मानचित्र में शामिल होने वाली कुंजियों की संख्या जैसे कुछ? क्या मुझे भी परवाह करना चाहिए?

उत्तर

14

मैं इसके बारे में ज्यादा चिंता नहीं करता।

कंटेनर गारंटी देता है कि बाल्टी गिनती कम से कम आपके द्वारा प्रदान किए जाने वाले मूल्य, यानी यदि आवश्यक हो तो यह बढ़ेगी। आप बाल्टी गिनती के रूप में शून्य गुजारें सकता और कार्यान्वयन या तो std::max(count, 10) की तरह कुछ करना होगा और शून्य मान को ओवरराइड, या यह सिर्फ पहली प्रविष्टि पर मिला देना होगा।

एक अन्य विकल्प एक डिफ़ॉल्ट-निर्मित वस्तु से मान की प्रतिलिपि करने के लिए होगा:

H hasher; 
unordered_map<K,T,H,P> m{ unordered_map<K,T,H,P>{}.bucket_count(), hasher }; 

इस बाल्टी गिनती जो कुछ भी करने के लिए कार्यान्वयन के डिफ़ॉल्ट है (लेकिन DefaultConstructible होने की H हैश फंक्शन प्रकार की आवश्यकता होती है स्थापित करेगा ।)

FWIW जीसीसी के unordered_map निर्माता आप से पता चला है के लिए डिफ़ॉल्ट के रूप में 10 का उपयोग करता है (ताकि शायद एक उचित डिफ़ॉल्ट भी है) और कंस्ट्रक्टर iterators या एक initializer_list की एक जोड़ी लेने के लिए 0 का उपयोग करता है।

+0

अच्छी चाल। इसके बारे में नहीं सोचा था। इसे देखने के लिए धन्यवाद। – zneak

+2

आप के बारे में 'std :: min' हैं? यदि आप कम से कम 10 तत्व चाहते हैं, तो सूत्र 'std :: max (count, 10) 'है। – fredoverflow

2

unordered_map के लिए टेम्प्लेट पैरामीटर में से एक हैश समारोह है। यदि आप अपने हैश फ़ंक्शन ऑब्जेक्ट को निर्दिष्ट करते हैं तो आप कन्स्ट्रक्टर पैरामीटर को अपनी डिफ़ॉल्ट सेटिंग्स पर छोड़ सकते हैं।

+2

जब मैं आपसे सहमत हूँ, आप किसी टेम्पलेट तर्क के रूप में क़मी बनाने की मशीन के * प्रकार * निर्दिष्ट कर सकता है, लेकिन अभी भी (उदाहरण के लिए निर्माण पर 'unordered_map' के लिए एक विशिष्ट hasher वस्तु प्रदान करने के लिए अगर आप कुछ फैंसी करना चाहता था की जरूरत है , यदि आपका हैशर हैश फ़ंक्शंस का सार्वभौमिक परिवार था और आपको यह निर्दिष्ट करने की आवश्यकता है कि इनमें से कौन सा हैश फ़ंक्शन उपयोग करने के लिए)। – templatetypedef

+0

रैपेटज़ ने सुझाव दिया कि सी ++ चैट पर। यह * मेरी प्रयोजनों के लिए करता है * काम के बाद से मैं सिर्फ एक समारोह सूचक (ताकि एक struct में यह लपेटकर कोई बड़ी बात नहीं है) पारित करने के लिए जा रहा था, और यह निश्चित रूप से उल्लेख के लायक है, लेकिन के रूप में @templatetypedef कहते हैं, यह वास्तव में लोगों को मदद नहीं करता है, जो वास्तव में एक बाल्टी गिनती देना है। – zneak

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

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