अनऑर्डरेड एसोसिएटिव कंटेनर (सी ++)

From Vigyanwiki

प्रोग्रामिंग भाषा सी++ में, अनऑर्डरेड एसोसिएटिव कंटेनर सी ++ मानक लाइब्रेरी में क्लास टेम्प्लेट का समूह है जो हैश तालिका के वेरिएंट को कार्यान्वित करता है। टेम्प्लेट के कारण उनका उपयोग आर्बिट्ररी तत्वों जैसे पूर्णांक अथवा कस्टम क्लासेज को संग्रहीत करने के लिए किया जा सकता है। निम्नलिखित कंटेनरों unordered_set, unordered_map, unordered_multiset, unordered_multimap को सी ++ मानक के वर्तमान संशोधन में परिभाषित किया गया है। इनमें से प्रत्येक कंटेनर उनके एलिमेंट्स के कॉन्सट्रेन्ट्स पर भिन्न होता है।

अनऑर्डरेड एसोसिएटिव कंटेनर सी ++ मानक लाइब्रेरी में एसोसिएटिव कंटेनर के समतुल्य होते हैं किन्तु उनके कॉन्सट्रेन्ट्स भिन्न-भिन्न होते हैं। अनऑर्डरेड एसोसिएटिव कंटेनरों में एलिमेंट्स उचित रूप से क्रमबद्ध नहीं होते हैं। यह ऑब्जेक्ट्स को संग्रहित करने के लिए हैशिंग के उपयोग के कारण होता है। कंटेनरों को रेगुलर एसोसिएटिव कंटेनर की भाँति इटरेट किया जा सकता है।

इतिहास

सी ++ भाषा में हैश तालिका का प्रथम व्यापक रूप से उपयोग किया जाने वाला कार्यान्वयन सिलिकॉन ग्राफिक्स (एसजीआई) मानक टेम्पलेट लाइब्रेरी (एसटीएल) के hash_map, hash_set, hash_multimap, hash_multiset क्लास टेम्पलेट्स थे।[1] उनकी उपयोगिता के कारण, उन्हें सी++ मानक लाइब्रेरी के विभिन्न अन्य कार्यान्वयनों (उदाहरण के लिए, जीएनयू संकलक संग्रह (जीसीसी) libstdc++[2] और विजुअल सी ++ (एमएसवीसी) मानक लाइब्रेरी) में सम्मिलित किया गया है। hash_* क्लास टेम्प्लेट सी ++ तकनीकी रिपोर्ट 1 (सी++ टीआर1) में प्रस्तावित किए गए थे और unordered_* नामों के अंतर्गत स्वीकार किए गए थे।[3] जिसके पश्चात उन्हें सी++ मानक के सी++11 संशोधन में सम्मिलित किया गया था।[4] बूस्ट सी++ लाइब्रेरी में <boost/unordered_map.hpp> के रूप में भी यह उपलब्ध है। [5]


फंक्शन्स का अवलोकन

कंटेनरों को हेडर में डिफाइन किया जाता है, उदाहरण के लिए, unordered_set को हेडर <unordered_set> में डिफाइन किया गया है। सभी कंटेनर कांसेप्ट (जेनेरिक प्रोग्रामिंग) की आवश्यकताओं को पूर्ण करते हैं, जिसका अर्थ है कि उनके निकट begin(), end(), size(), max_size(), empty(), और swap() विधियाँ होती हैं।

unordered_set
(C++11)
unordered_map
(C++11)
unordered_multiset
(C++11)
unordered_multimap
(C++11)
विवरण
(constructor) (constructor) (constructor) (constructor) विभिन्न स्रोतों से कंटेनर का निर्माण करता है।
(destructor) (destructor) (destructor) (destructor) सेट और निहित एलिमेंट्स को नष्ट कर देता है।
operator= operator= operator= operator= कंटेनर को वैल्यू असाइन करता है।
get_allocator get_allocator get_allocator get_allocator एलिमेंट्स को मेमोरी एलोकेट करने के लिए प्रयुक्त एलोकेटर रिटर्न करता है।
एलिमेंट एक्सेस at बाउंड चेकिंग के साथ निर्दिष्ट एलिमेंट्स को एक्सेस करता है।
operator[] बाउंड चेकिंग के अतिरिक्त निर्दिष्ट एलिमेंट्स को एक्सेस करता है।
इटरेटर begin begin begin begin कंटेनर के प्रारम्भ में इटरेटर रिटर्न करता है।
end end end end कंटेनर के अंत में इटरेटर रिटर्न करता है।
क्षमता empty empty empty empty चेक करता है कि क्या कंटेनर रिक्त है
size size size size कंटेनर में एलिमेंट्स की संख्या रिटर्न करता है।
max_size max_size max_size max_size कंटेनर में एलिमेंट्स की अधिकतम संभव संख्या रिटर्न करता है।
संशोधक clear clear clear clear कंटेंट्स को क्लियर करता है।
insert insert insert insert एलिमेंट्स को इन्सर्ट करता है।
emplace emplace emplace emplace इन-प्लेस एलिमेंट्स का निर्माण करता है (C++11)
emplace_hint emplace_hint emplace_hint emplace_hint संकेत (C++11) का उपयोग करके इन-प्लेस एलिमेंट्स का निर्माण करता है
erase erase erase erase एलिमेंट्स को इरेज करता है।
swap swap swap swap कंटेंट्स को दूसरे कंटेनर से स्वैप करता है।
लुकउप count count count count विशिष्ट कुंजी से युग्मित होने वाले एलिमेंट्स की संख्या रिटर्न करता है।
find find find find विशिष्ट कुंजी के साथ एलिमेंट को फाइंड करता है।
equal_range equal_range equal_range equal_range विशिष्ट कुंजी से युग्मित होने वाले एलिमेंट्स की श्रेणी रिटर्न करता है।
बकेट इंटरफ़ेस ...
हैश नीति ...
प्रेक्षक hash_function hash_function hash_function hash_function कुंजी का हैश बनाने के लिए उपयोग किया गया फ़ंक्शन रिटर्न करता है।
key_eq key_eq key_eq key_eq की कम्पेरिज़न फ़ंक्शन रिटर्न करता है।


उपयोग उदाहरण

#include <iostream>
#include <string>
#include <unordered_map>
 
int main()
{
    std::unordered_map<std::string, int> months;
    months["january"] = 31;
    months["february"] = 28;
    months["march"] = 31;
    months["april"] = 30;
    months["may"] = 31;
    months["june"] = 30;
    months["july"] = 31;
    months["august"] = 31;
    months["september"] = 30;
    months["october"] = 31;
    months["november"] = 30;
    months["december"] = 31;
    std::cout << "september -> " << months["september"] << std::endl;
    std::cout << "april     -> " << months["april"] << std::endl;
    std::cout << "december  -> " << months["december"] << std::endl;
    std::cout << "february  -> " << months["february"] << std::endl;
    return 0;
}


कस्टम हैश फ़ंक्शंस

Std :: unordered_map में कस्टम ऑब्जेक्ट्स का उपयोग करने के लिए, कस्टम हैश फ़ंक्शन को परिभाषित किया जाना चाहिए। यह फ़ंक्शन कस्टम प्रकार का कॉन्स्ट रिफरेन्स लेता है और size_t रिटर्न करता है।

#include <unordered_map>
 
struct X{int i,j,k;};

struct hash_X{
  size_t operator()(const X &x) const{
    return std::hash<int>()(x.i) ^ std::hash<int>()(x.j) ^ std::hash<int>()(x.k);
  }
};

यूजर फंक्शन डिफाइन करता है जिसका उपयोग std :: unordered_map में टेम्पलेट पैरामीटर के रूप में पास करके किया जा सकता है

 std::unordered_map<X,int,hash_X> my_map;

या std::hash फ़ंक्शन को डिफ़ॉल्ट हैश फ़ंक्शन के रूप में सेट किया जा सकता है

namespace std {
    template <>
        class hash<X>{
        public :
        size_t operator()(const X &x ) const{
            return hash<int>()(x.i) ^ hash<int>()(x.j) ^ hash<int>()(x.k);
        }
    };
}

//...
 std::unordered_map<X,int> my_map;


संदर्भ

  1. "hash_map<Key, Data, HashFcn, EqualKey, Alloc>". Silicon Graphics (SGI). Retrieved 26 January 2011.
  2. "libstdc++: hash_map Class Template Reference". Retrieved 26 January 2011.
  3. WG21 (9 April 2003). "A Proposal to Add Hash Tables to the Standard Library (revision 4)". n1456.
  4. WG21 (21 August 2010), Working Draft, Standard for Programming Language C++ (PDF), n3126
  5. "Class template unordered_map". Boost. Retrieved 26 January 2011.