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

From Vigyanwiki
Revision as of 14:56, 18 May 2023 by alpha>Artiverma

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

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

इतिहास

सी ++ भाषा में हैश टेबल का प्रथम व्यापक रूप से उपयोग किया जाने वाला कार्यान्वयन सिलिकॉन ग्राफिक्स (एसजीआई) स्टैण्डर्ड टेम्पलेट लाइब्रेरी (एसटीएल) के hash_map, hash_set, hash_multimap, hash_multiset क्लास टेम्पलेट्स थे।[1] उनकी उपयोगिता के कारण, उन्हें C++ मानक लाइब्रेरी के विभिन्न अन्य कार्यान्वयनों (उदाहरण के लिए, जीएनयू संकलक संग्रह (जीसीसी) libstdc++[2] और विजुअल सी ++ (एमएसवीसी) मानक लाइब्रेरी) में सम्मिलित किया गया है। hash_* क्लास टेम्प्लेट सी ++ तकनीकी रिपोर्ट 1 (C++ TR1) में प्रस्तावित किए गए थे और unordered_* नामों के अंतर्गत स्वीकार किए गए थे।[3] जिसके पश्चात उन्हें C++ मानक के C++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)
Description
(constructor) (constructor) (constructor) (constructor) Constructs the container from variety of sources
(destructor) (destructor) (destructor) (destructor) Destructs the set and the contained elements
operator= operator= operator= operator= Assigns values to the container
get_allocator get_allocator get_allocator get_allocator Returns the allocator used to allocate memory for the elements
Element access at Accesses specified element with bounds checking.
operator[] Accesses specified element without bounds checking.
Iterators begin begin begin begin Returns an iterator to the beginning of the container
end end end end Returns an iterator to the end of the container
Capacity empty empty empty empty Checks whether the container is empty
size size size size Returns number of elements in the container.
max_size max_size max_size max_size Returns the maximum possible number of elements in the container
Modifiers clear clear clear clear Clears the contents.
insert insert insert insert Inserts elements.
emplace emplace emplace emplace Constructs elements in-place (C++11)
emplace_hint emplace_hint emplace_hint emplace_hint Constructs elements in-place using a hint (C++11)
erase erase erase erase Erases elements.
swap swap swap swap Swaps the contents with another container.
Lookup count count count count Returns the number of elements matching specific key.
find find find find Finds an element with specific key.
equal_range equal_range equal_range equal_range Returns a range of elements matching specific key.
Bucket interface ...
Hash policy ...
Observers hash_function hash_function hash_function hash_function Returns the function used to create hash of a key
key_eq key_eq key_eq key_eq Returns key comparison function.


उपयोग उदाहरण

#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.