2008-09-25 16 views
52

मैं आमतौर पर सी ++ stdlib मानचित्र का उपयोग करता हूं जब भी मुझे किसी विशिष्ट प्रकार के मान (एक महत्वपूर्ण मान - जैसे एक स्ट्रिंग या अन्य ऑब्जेक्ट) से जुड़े कुछ डेटा स्टोर करने की आवश्यकता होती है। Stdlib नक्शा कार्यान्वयन पेड़ों पर आधारित है जो मानक सरणी या stdlib वेक्टर की तुलना में बेहतर प्रदर्शन (ओ (लॉग एन) प्रदान करता है।सी ++ में हैशटेबल?

मेरे प्रश्न हैं, क्या आप किसी भी सी ++ "मानक" हैशटेबल कार्यान्वयन के बारे में जानते हैं जो बेहतर प्रदर्शन (ओ (1)) प्रदान करता है? जावा एपीआई से हैशटेबल क्लास में जो कुछ उपलब्ध है उसके समान कुछ।

उत्तर

74

यदि आप सी ++ 11 का उपयोग कर रहे हैं, तो आपके पास <unordered_map> और <unordered_set> हेडर तक पहुंच है। ये कक्षाएं std::unordered_map और std::unordered_set प्रदान करती हैं।

आप TR1 साथ सी ++ 03 का उपयोग कर रहे हैं, तो आप एक ही हेडर का उपयोग करके (जब तक आप जीसीसी, जिस स्थिति में हेडर <tr1/unordered_map> और <tr1/unordered_set> बजाय का उपयोग कर रहे हैं) वर्ग std::tr1::unordered_map और std::tr1::unordered_set की पहुंच है,।

सभी मामलों में, संबंधित unordered_multimap और unordered_multiset प्रकार भी हैं।

+6

जीसीसी में, आपको इसके बजाय हेडर नाम और का उपयोग करना होगा। यह एक जीसीसी क्विर्क है। :-) –

+0

वीएस 2008 फीचर पैक एसपी 1 द्वारा अधिग्रहित किया गया है। – Ferruccio

+0

आईआईआरसी वीसी 9 फ़ीचर पैक और एसपी 1 टीआर :: unordered_ * कार्यान्वयन उप-इष्टतम प्रदर्शन की रिलीज नोट्स चेतावनी के साथ आया था।मुझे लगता है कि यह अंततः तय किया जाएगा। – jwfearn

1

एसजीआई से std::hash_map देखें।

यह STLPort वितरण में भी शामिल है।

+0

में बढ़ावा :: unordered_map का उपयोग यह STLport में शामिल किया जा सकता है, लेकिन यह है अभी भी "मानक" नहीं है, जैसा कि सवाल मांगा गया है। हैश_मैप नामक कोई _ मानक मानक नहीं है; इसे इसके बजाय unordered_map कहा जाता है, और यह TR1 में है। –

3

hash_map ऑब्जेक्ट है जैसा कि यहां उल्लेख किया गया है, लेकिन यह एसटीएल का हिस्सा नहीं है। यह एक एसजीआई एक्सटेंशन है, इसलिए यदि आप एसटीएल में कुछ ढूंढ रहे थे, तो मुझे लगता है कि आप भाग्य से बाहर हैं।

2

विजुअल स्टूडियो में हेडर <hash_map> में वर्ग stdext::hash_map है, और gcc के पास उसी शीर्षलेख में __gnu_cxx::hash_map है।

+0

यदि उनके पास एक ही इंटरफ़ेस है, तो यह कार्यान्वयन करना बहुत आसान है जो नामस्थान एलियास और कुछ प्री-प्रोसेसर काम का उपयोग करके दोनों का समर्थन करता है। –

+0

मुझे पता है, मुझे पता है, यह सामान से वंचित है। वीएस 2008 में स्विच करने या बूस्ट इंस्टॉल करने के लिए हर कॉलेग्यू को आश्वस्त नहीं किया जा सकता है। तो यहाँ कैसे प्राप्त करने के लिए पर एक अच्छा चाल है एक साथ इन: 'नाम स्थान एसटीडी { #ifdef __GNUC__ \t नाम स्थान __gnu_cxx उपयोग करते हुए; #elif \t नामस्थान stdext का उपयोग कर; #endif } ' – ypnos

1

हैश_मैप जीएनयू के libstdc++ में भी समर्थित है।

डिनक्यूमवेयर भी supports यह, जिसका अर्थ है कि बहुत से कार्यान्वयन में हैश_मैप होगा (मुझे लगता है कि विज़ुअल सी ++ डिनक्यूवेयर के साथ भी प्रदान करता है)।

+0

यह व्यापक रूप से समर्थित हो सकता है, लेकिन यह" मानक "नहीं है, जैसा कि प्रश्नकर्ता ने पूछा था। केवल टीआर 1 सुविधाओं को मानक माना जा सकता है। –

+0

मैं जो बिंदु बना रहा था वह यह है कि यदि सभी कंपाइलर विक्रेता इसका समर्थन करते हैं (या stdlibC++ विक्रेताओं, जैसा भी मामला हो), तो यह "मानक" के लिए एक अच्छा पर्याप्त विकल्प हो सकता है। बीटीडब्ल्यू, टीआर 1 अभी तक "मानक" नहीं है। यह अगले मानक के लिए स्वीकार किया जाता है, जो विक्रेताओं को इसे लागू करने के लिए पर्याप्त है (मेरा बिंदु ...) –

+0

मुझे लगता है कि यह libstdC++ संस्करण> = 4.0 के लिए है? बूस्ट के लिए – rogerdpack

16

यदि आपके पास पहले से ही unordered_map या unordered_set नहीं है, तो वे boost का हिस्सा हैं।
Here's the documentation for both

+0

वाई एक बार फिर _maximal पोर्टेबिलिटी_ प्रदान करते हैं। :-) इस के दूसरे उदाहरण के लिए http://stackoverflow.com/questions/131445 देखें। –

1

यदि आपके पास यार कंपाइलर के लिए TR1 एक्सटेंशन उपलब्ध हैं, तो उन का उपयोग करें। यदि नहीं, boost.org का एक संस्करण है जो std :: namepace को छोड़कर काफी समान है। उस स्थिति में, उपयोग-घोषणा में डाल दें ताकि आप बाद में std :: पर स्विच कर सकें।

2

std :: tr1 :: unordered_map, <unordered_map>

में अगर तुम, tr1 नहीं है बढ़ावा मिलता है, और <boost/unordered_map.hpp>