सी++ एस टी एल कंटेनर्स

मुक्त ज्ञानकोश विकिपीडिया से
नेविगेशन पर जाएँ खोज पर जाएँ

स्टैण्डर्ड टेम्पलेट लाइब्रेरी (एस टी एल) , सी++ कंप्यूटर प्रोग्रामिंग की एक सॉफ्टवेयर संग्रह है जिसका प्रयोग अन्य कंप्यूटर प्रोग्राम के विभिन भागो में किया जाता है। एस टी एल को दिए हुए चार भागो में विभाजित किया गया है, नामतः कलन विधि (अल्गोरिथम), पात्र (कंटेनर), फलन (फंक्शन) और इटरेटर। [१]

एस टी एल कंटेनर्स एक प्रकार के डाटा धारक है जिनका प्रयोग सी++ में विभिन प्रकार के डाटा को संग्रा करने के लिए किया जाता है। इन्हे क्लास टेम्प्लेट के रूप में लागू किया जाता है, जो समर्थित प्रकारों में एक महान नम्यता प्रदान करते है। ये अलग अलग प्रकार के डाटा जैसे इंट, फ्लोट, डबल,केयर ,स्ट्रिंग आदि को सामान्य तरीके से उपयोग कर सकते है। इनको दो भागो में विभाजित किया जा सकता है, नामतः अनुक्रम (सीक्वेंस ) कंटेनर्स और सहयोगी (अस्सोसिएटिवे) कंटेनर्स।

कंटेनर्स

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

इनको दो भागो में विभाजित किया जा सकता है, नामतः अनुक्रम (सीक्वेंस ) कंटेनर्स और सहयोगी (अस्सोसिएटिवे) कंटेनर्स। [२]

सीक्वेंस कंटेनर्स

जैसा कि नाम से पता चलता है कि तत्वों को क्रमिक रूप से एक्सेस किया जा सकता है। निम्न कंटेनरों में से प्रत्येक डेटा भंडारण के लिए अलग-अलग एल्गोरिथ्म का उपयोग करता है इस प्रकार विभिन्न कार्यों के लिए उनकी अलग गति होती है। और कंटेनरों में सभी तत्व एक ही प्रकार के होने चाहिए। मानक सीक्वेंस कंटेनरों में वेक्टर, डीकयू और लिस्ट शामिल हैं। [३]

सीक्वेंस कंटेनर्स सूची
कंटेनर विवरण
वेक्टर (vector) गतिशील ऐरे,किसी डाटा को सम्मिलित या मिटाते समय स्वयं को खुद ब खुद आकार देने की क्षमता रखते है ।  वेक्टर के अंत में एक तत्व (एलिमेंट) सम्मिलित करना निरंतर समय में परिशोधन करता है। अंतिम तत्व को हटाने में केवल निरंतर समय लगता है, क्योंकि कोई आकार परिवर्तन नहीं होता है। शुरुआत या मध्य में एलिमेंट सम्मिलित करना और मिटा देना  लीनियर समय में होता है।
डीकयू (deque) एक वेक्टर जो शुरुआत में या अंत में, एलिमेंट के आवेषण या मिटने  के लिए परिशोधित निरंतर समय लेता है।
लिस्ट (list) एक डबली -लिंक्ड लिस्ट, इसमें एलिमेंट्स लगातार संग्रहीत नहीं किये जाते।  इसका प्रदर्शन वेक्टर से विपरीत होता है। धीमी गति से देखने और पहुंचना (लीनियर समय), लेकिन एक बार एक पोजीशन मिल जाने के बाद, एलिमेंट को सम्मिलन और मिटाना (निरंतर समय)।

अस्सोसिएटिवे कंटेनर्स

अस्सोसिएटिवे कंटेनर क्रमबद्ध डेटा संरचनाओं को लागू करते हैं जिन्हें जल्दी से खोजा जा सकता है। इन कंटेनरों की दो महत्वपूर्ण विशेषताएं हैं [४]

  1. एक महत्वपूर्ण मुख्य मूल्य जोड़ी (के वैल्यू पेअर) मौजूद है। मानचित्र (मैप) और सेट के मामले में, मूल अद्वितीय होती है।
  2. एलिमेंट्स सख्त कमजोर आदेश का पालन करते हैं ।

अस्सोसिएटिवे कंटेनर को दो भागो में विभाजित किया जा सकता है , नामतः आदिष्ट (ऑर्डरद) और अनआदिष्ट (अनऑर्डरद) अस्सोसिएटिवे कंटेनर

ऑर्डरद अस्सोसिएटिवे कंटेनर्स

मानक ऑर्डरद कंटेनर हैं मैप, सेट, मल्टीमैप, मल्टीमैप।

ऑर्डरद अस्सोसिएटिवे कंटेनर्स
कंटेनर विवरण
मैप (map) एक डेटा आइटम (एक कुंजी) से दूसरे (एक मूल्य) की मैपिंग की अनुमति देता है । कुंजियों के आधार पर छांटे गए कुंजी-मूल्य पेअर जिसमे कुंजी का संग्रह अद्वितीय है ।
सेट (set) अद्वितीय कुंजी (की) का संग्रह, जो कुंजी (की) द्वारा छांटा हुआ संग्रह किया जाता है । सेट ऑपरेशन यूनियन, प्रतिच्छेदन, अंतर, सममित अंतर और समावेशन का परीक्षण प्रदान करता है । आमतौर पर सेल्फ-बैलेंसिंग बाइनरी सर्च ट्री का उपयोग करके कार्यान्वित किया जाता है।
मल्टीमैप (multimap) मैप जैसा परंतु डुप्लिकेट कुंजियों की अनुमति देता है।
मल्टीसेट (multiset) सेट जैसा परंतु डुप्लिकेट एलिमेंट्स की अनुमति देता है।

अनऑर्डरद अस्सोसिएटिवे कंटेनर्स

मानक अनऑर्डरद कंटेनर हैं अनऑर्डरद मैप, अनऑर्डरद सेट।

अनऑर्डरद अस्सोसिएटिवे कंटेनर्स
कंटेनर विवरण
अनऑर्डरद मैप (unordered map) मैप के समान, लेकिन सॉर्ट किए गए क्रम में कुंजी-मूल्य पेअर को संग्रहीत नहीं करता है
अनऑर्डरद सेट

(unordered set)

सेट के समान, लेकिन सॉर्ट किए गए क्रम में तत्वों को संग्रहीत नहीं करता है

कंटेनर सिंटैक्स और फ़ंक्शन

नीचे आम कंटेनरों के वाक्य रचना और कुछ बुनियादी फंक्शन हैं

वेक्टर (vector)

वेक्टर अपने तत्वों का एक निश्चित क्रम बनाए रखता है, ताकि जब कोई नया तत्व शुरुआत में या वेक्टर के बीच में डाला जाए, तो बाद के तत्वों को पीछे की ओर ले जाया जाए। [५]

1. प्रख्यापन (डिक्लेरेशन)

वेक्टर डिक्लेरेशन

2. बुनियादी फंक्शन

वेक्टर के कुछ बुनियादी फंक्शन्स

मैप (map)

मैप्स एसोसिएटेड कंटेनर होते हैं जो मैप किए गए फैशन में तत्वों को स्टोर करते हैं। प्रत्येक तत्व का एक महत्वपूर्ण मूल्य और एक मैप किया गया मान है। किसी भी दो मैप किए गए मान में समान मान नहीं हो सकते। [६]

निम्नलिखित छवि से पता चलता है कि नक्शा कैसे डिक्लेअर किया जाए, इसमें तत्व डालें और तत्व को एक्सेस करें ।

मैप डिक्लेरेशन एंड फंक्शन

स्टैण्डर्ड टेम्पलेट लाइब्रेरी (STL) C ++ प्रोग्रामिंग भाषा के लिए एक सॉफ्टवेयर लाइब्रेरी है जिसने C ++ Standard Library के कई हिस्सों को प्रभावित किया है। यह एल्गोरिदम, कंटेनर, फ़ंक्शंस और पुनरावृत्तियों नामक चार घटक प्रदान करता है। एसटीएल सी ++ के लिए सामान्य वर्गों का एक सेट प्रदान करता है, जैसे कंटेनर और साहचर्य सरणियाँ, जिनका उपयोग किसी भी प्रकार में और किसी भी उपयोगकर्ता-परिभाषित प्रकार के साथ किया जा सकता है जो कुछ प्राथमिक कार्यों (जैसे नकल और असाइनमेंट) का समर्थन करता है। एसटीएल एल्गोरिदम, कंटेनरों से स्वतंत्र हैं, जो लाइब्रेरी की जटिलता को काफी कम कर देता है।

STL टेम्प्लेट के उपयोग के माध्यम से अपने परिणाम प्राप्त करता है। यह दृष्टिकोण संकलन-समय के बहुरूपता प्रदान करता है जो अक्सर पारंपरिक रन-टाइम बहुरूपता से अधिक कुशल होता है। आधुनिक सी ++ संकलक को एसटीएल के भारी उपयोग से उत्पन्न होने वाले अमूर्त दंड को कम करने के लिए तैयार किया गया है। एसटीएल को सी ++ के लिए जेनेरिक एल्गोरिदम और डेटा संरचनाओं की पहली लाइब्रेरी के रूप में बनाया गया था, जिसमें चार विचार हैं: जेनेरिक प्रोग्रामिंग, दक्षता की हानि के बिना सार, वॉन न्यूमैन कम्प्यूटेशन मॉडल, और मूल्य शब्दार्थ


हिस्ट्री : नवंबर 1993 में अलेक्जेंडर स्टेपानोव ने C ++ मानकीकरण के लिए ANSI / ISOसाँचा:category handlerसाँचा:main otherसाँचा:main other[dead link] समिति को जेनेरिक प्रोग्रामिंग पर आधारित एक पुस्तकालय प्रस्तुत किया। समिति की प्रतिक्रिया अत्यधिक अनुकूल थी और मार्च 1994 की बैठक के लिए एक औपचारिक प्रस्ताव के लिए एंड्रयू कोएनिग से अनुरोध किया गया था। समिति के पास परिवर्तन और विस्तार के लिए कई अनुरोध थे और समिति के सदस्यों ने स्टेपानोव और मेंग ली के साथ मुलाकात कर विवरण निकालने में मदद की। सबसे महत्वपूर्ण विस्तार (सहयोगी कंटेनरों) के लिए आवश्यकताओं को पूरी तरह से उन्हें लागू करने के अनुरूप होना दिखाया गया था, एक चरण Stepanov डेविड Musser को सौंपा। एक प्रस्ताव को जुलाई 1994 एएनएसआई / आईएसओ समिति की बैठक में अंतिम मंजूरी मिली। इसके बाद, Stepanov और ली दस्तावेज़ 17 को ANSI / ISO C ++ ड्राफ्ट मानक (1, 27 के माध्यम से खंड 17 के कुछ हिस्सों) में शामिल किया गया था। एसटीएल के शुरुआती व्यापक प्रसार के लिए संभावनाओं को हेवलेट-पैकर्ड के निर्णय के साथ अगस्त 1994 में इंटरनेट पर स्वतंत्र रूप से उपलब्ध कराने के निर्णय में काफी सुधार किया गया था। मानकीकरण प्रक्रिया के दौरान स्टेपानोव, ली और मूसर द्वारा विकसित यह कार्यान्वयन कई का आधार बन गया। संकलक और पुस्तकालय विक्रेताओं द्वारा आज लागू किए गए कार्यान्वयन।


वेक्टर (vector): एक वेक्टर सी में 1-आयामी सरणी से मेल खाता है। एक वेक्टर इस तरह से घोषित किया जाता है:

vector<int> a; // पूर्णांक के एक वेक्टर की घोषणा करें

vector<MyStruct> b; // MyStruct का एक वेक्टर घोषित करें

दोनों के ऊपर घोषित वैक्टर में शुरू में शून्य तत्व होते हैं। यह कोई समस्या नहीं है, क्योंकि वैक्टर (सभी एसटीएल कंटेनरों की तरह) तत्वों को सम्मिलित करके गतिशील रूप से बढ़ सकते हैं। तत्वों के साथ एक वेक्टर को इनिशियलाइज़ करना भी संभव है और उन्हें एक विशिष्ट मूल्य भी दिया जाता है:

vector<int> c (50,1); // पूर्णांक के वेक्टर को 50 तत्वों के साथ घोषित करें, सभी 1 पर सेट करें

संरचना और कक्षाओं के लिए, प्रारंभिक मूल्य एक निर्माता होना चाहिए। यदि प्रारंभिक मान छोड़ दिया जाता है, तो डिफ़ॉल्ट निर्माणकर्ता का उपयोग किया जाएगा (साधारण प्रकार जैसे इंट, डबल आदि के मामले में, प्रारंभिक मूल्य 0 है)। वेक्टर में तत्वों को उसी तरह एक्सेस किया जाता है जैसे कि ऐरे [संचालक] का उपयोग करते हुए। तत्वों का उपयोग करके भी पहुँचा जा सकता है:

cout << c [5] << endl;

cout << c.at (5) << endl;

यदि आप वेक्टर के बाहर एक तत्व का उपयोग करने का प्रयास करते हैं, तो दोनों के बीच अंतर यह है कि अपवाद नहीं उठाया जाएगा। एक तत्व को अंत तक जोड़कर एक वेक्टर के आकार का विस्तार पुश_बैक विधि से किया जाता है:

वेक्टर <int> (10,1);

a.push_back (2); // तत्व 0 से 9 ए 1 में है, और तत्व 10 2 है।

वेक्टर में कहीं और तत्वों को सम्मिलित करना संभव नहीं है। वेक्टर का आकार बदलने के अन्य तरीकों में आकार विधि शामिल है:

वेक्टर <int> (10,1);

a.resize (15); // तत्व 0 से 9 ए 1 में है, और तत्व 10 से 14 है।

यदि आकार बदलने पर तत्वों की संख्या बढ़ जाती है, तो डिफॉल्ट कंस्ट्रक्टर को नए तत्वों को सौंपा जाता है। वेक्टर का आकार घटाना वेक्टर के अंत से तत्वों को हटा देता है। वेक्टर कक्षा में अन्य उपयोगी विधियाँ हैं: (T प्रत्येक तत्व का प्रकार है)

size_t size (); // वेक्टर में तत्वों की संख्या लौटाता है

void pop_back();// अंतिम तत्व को हटाता है

T back(); // अंतिम तत्व का मान लौटाता है

void clear(); // अनिवार्य रूप से आकार (0) के रूप में एक ही बात।

सॉर्टिंग  : एक वेक्टर को क्रमबद्ध किया जा सकता है: (एरेज़ पर भी काम करता है)

sort(&a[0],&a[N]); // एन = सदिश में कोई तत्व (यानी a.size ())

यह सभी तत्वों को डिफ़ॉल्ट क्रम में सॉर्ट करेगा। अंतर्निहित प्रकारों के लिए, डिफ़ॉल्ट क्रम आरोही है। संरचना और कक्षाओं के लिए, आप यह निर्धारित करके डिफ़ॉल्ट ऑर्डर को परिभाषित कर सकते हैं कि कम-से-कम ऑपरेटर को कैसे काम करना चाहिए:

बूल ऑपरेटर <(const MyStruct & a, const MyStruct & b) { // ए <बी, झूठा अगर ए> = बी }

सॉर्ट करने के लिए दो मापदंडों को निर्दिष्ट करने के लिए वेक्टर में श्रेणी को निर्दिष्ट करें, पहले तत्व और पिछले एक के बाद के तत्व को इंगित करके। तो सॉर्ट (& [[0], और [एन]) तत्वों को 0,1, ..., एन -1 से सॉर्ट करें। किसी श्रेणी को निर्दिष्ट करने का यह तरीका पूरे एसटीएल में उपयोग किया जाता है, और बहुत व्यावहारिक है। चूंकि यह सबसे आम है आप पूरे वेक्टर पर एक ऑपरेशन करना चाहते हैं, इसलिए प्रारंभ और समापन बिंदु के विशेष नाम हैं: प्रारंभ () और अंत ()। इसलिए सॉर्ट (& [[0], और [एन]) के बजाय कोई सॉर्ट (a.begin (), a.end ()) कर सकता है। वास्तव में, & a [0] और a.begin () सामान्य रूप से विनिमेय नहीं हैं क्योंकि पूर्व एक सूचक है और बाद में एक पुनरावृत्त (इसके बारे में अधिक)।

इन्हें भी देखें

1. https://en.wikipedia.org/wiki/Standard_Template_Library#Containers

2. https://en.wikipedia.org/wiki/Sequence_container_(C%2B%2B)#Vector

सन्दर्भ