यदि आप किसी इंडेक्स के साथ एक मूल्य जोड़ना चाहते हैं और इंडेक्स को जल्दी से ढूंढना चाहते हैं तो आप std::map
या std::unordered_map
का उपयोग कर सकते हैं। डेटा पर प्रदर्शन करने वाले अन्य परिचालनों के आधार पर आप इन्हें अन्य डेटा संरचनाओं (उदा। std::list
या std::vector
) के साथ भी जोड़ सकते हैं।
उदाहरण के लिए, जब वेक्टर बनाने हम भी एक लुकअप तालिका बनाने के लिए:
vector<int> test(test_size);
unordered_map<int, size_t> lookup;
int value = 0;
for(size_t index = 0; index < test_size; ++index)
{
test[index] = value;
lookup[value] = index;
value += rand()%100+1;
}
अब सूचकांक आप बस को देखने के लिए:
size_t index = lookup[find_value];
एक हैश तालिका आधारित डेटा संरचना का उपयोग करना (जैसे unordered_map) एक काफी शास्त्रीय स्थान/समय व्यापार है और जब आप बहुत सारे लुकअप करने की ज़रूरत होती है तो इस तरह के "रिवर्स" लुकअप ऑपरेशन के लिए बाइनरी खोज करने से बेहतर प्रदर्शन कर सकते हैं। दूसरा फायदा यह है कि यह भी काम करता है जब वेक्टर रद्द नहीं होता है।
मस्ती के लिए
:-) मैं VS2012RC में एक त्वरित बेंचमार्क एक रेखीय खोज के साथ और एक वेक्टर पर देखने के लिए unordered_map का उपयोग कर, सभी के साथ जेम्स 'द्विआधारी खोज कोड की तुलना किया है:
करने के लिए ~ 50000 तत्वों unordered_set महत्वपूर्ण (x3-4) अपेक्षित ओ (लॉग एन) व्यवहार को प्रदर्शित करने वाली बाइनरी खोज से बाहर है, कुछ हद तक आश्चर्यजनक परिणाम यह है कि unordered_map यह 10000 तत्वों के पिछले ओ 00 (1) व्यवहार को खो देता है, शायद हश टकराव के कारण, शायद एक कार्यान्वयन मुद्दा।
संपादित करें: unordered मानचित्र के लिए max_load_factor() 1 है इसलिए कोई टकराव नहीं होना चाहिए। बहुत बड़े वैक्टरों के लिए बाइनरी खोज और हैश टेबल के बीच प्रदर्शन में अंतर कैशिंग से संबंधित प्रतीत होता है और बेंचमार्क में लुकअप पैटर्न के आधार पर भिन्न होता है।
Choosing between std::map and std::unordered_map आदेशित और अनियंत्रित मानचित्रों के बीच अंतर के बारे में बात करता है।
स्रोत
2012-07-07 22:10:36
यह भी संकलित करता है? – Ulterior
@Ulterior: हां, यह मेरी CxxReflect लाइब्रेरी से कॉपी-पास्ता है। [Algorithm.hpp] देखें (http://cxxreflect.codeplex.com/SourceControl/changeset/view/8ffbb562ad38#cxxreflect%2fcore%2falgorithm.hpp)। –
यह संकलित क्यों नहीं करेगा? मुझे त्रुटि का कोई सबूत नहीं दिखता है। – Puppy