स्टैंडर्ड टेम्पलेट लाइब्रेरी

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

एसटीएल अपने परिणाम टेम्पलेट (प्रोग्रामिंग) के उपयोग के माध्यम से प्राप्त करता है। यह दृष्टिकोण संकलन-समय बहुरूपता प्रदान करता है जो अक्सर वस्तु-उन्मुख प्रोग्रामिंग में पारंपरिक बहुरूपता से अधिक कुशल होता है। रन-टाइम बहुरूपता। एसटीएल के भारी उपयोग से उत्पन्न होने वाले अमूर्त दंड को कम करने के लिए आधुनिक सी ++ संकलक ्स को ट्यून किया गया है।

STL को C++ के लिए जेनेरिक एल्गोरिदम और डेटा संरचनाओं की पहली लाइब्रेरी के रूप में बनाया गया था, चार विचारों को ध्यान में रखते हुए: सामान्य प्रोग्रामिंग, एब्सट्रैक्शन (कंप्यूटर साइंस) दक्षता की हानि के बिना, वॉन न्यूमैन वास्तुकला, और मूल्य शब्दार्थ।

एसटीएल और सी ++ मानक पुस्तकालय दो अलग-अलग संस्थाएं हैं।

इतिहास
नवंबर 1993 में अलेक्जेंडर स्टेपानोव ने C++ मानकीकरण के लिए ANSI/ISO समिति को जेनेरिक प्रोग्रामिंग पर आधारित एक पुस्तकालय प्रस्तुत किया। समिति की प्रतिक्रिया अत्यधिक अनुकूल थी और मार्च 1994 की बैठक के लिए औपचारिक प्रस्ताव के लिए एंड्रयू कोएनिग (प्रोग्रामर) से अनुरोध किया गया। समिति के पास परिवर्तन और विस्तार के लिए कई अनुरोध थे और समिति के सदस्यों ने विवरण तैयार करने में मदद करने के लिए स्टेपानोव और मेंग ली से मुलाकात की। सबसे महत्वपूर्ण विस्तार (सहयोगी कंटेनर) के लिए आवश्यकताओं को पूरी तरह से लागू करके सुसंगत होना दिखाया जाना था, एक कार्य स्टेपानोव ने डेविड मूसर को सौंपा था। जुलाई 1994 में एएनएसआई/आईएसओ समिति की बैठक में एक प्रस्ताव को अंतिम स्वीकृति मिली। इसके बाद, Stepanov और Lee दस्तावेज़ 17 को ANSI/ISO C++ प्रारूप मानक (1, खंड 17 से 27 के भाग) में शामिल किया गया।

अगस्त 1994 में हेवलेट-पैकर्ड के इंटरनेट पर स्वतंत्र रूप से उपलब्ध कराने के निर्णय के साथ एसटीएल के शुरुआती व्यापक प्रसार की संभावनाओं में काफी सुधार हुआ। मानकीकरण प्रक्रिया के दौरान स्टेपानोव, ली और मूसर द्वारा विकसित यह कार्यान्वयन, इसका आधार बन गया। आज संकलक और पुस्तकालय विक्रेताओं द्वारा पेश किए जाने वाले कई कार्यान्वयन।

कंटेनर
एसटीएल में अनुक्रम कंटेनर (डेटा संरचना) और सहयोगी कंटेनर शामिल हैं। कंटेनर ऐसी वस्तुएं हैं जो डेटा संग्रहीत करती हैं। मानक सूची (कंप्यूटिंग) में शामिल हैं, , और. मानक साहचर्य सरणी हैं, , , , , , और. कंटेनर एडेप्टर भी हैं, , और , जो कार्यान्वयन के रूप में अन्य कंटेनरों का उपयोग करते हुए विशिष्ट इंटरफ़ेस वाले कंटेनर हैं।

इटरेटर
एसटीएल पांच अलग-अलग प्रकार के पुनरावृत्तियों को लागू करता है। ये इनपुट इटरेटर हैं (जिनका उपयोग केवल मानों के अनुक्रम को पढ़ने के लिए किया जा सकता है), आउटपुट इटरेटर्स (जिनका उपयोग केवल मानों के अनुक्रम को लिखने के लिए किया जा सकता है), फॉरवर्ड इटरेटर्स (जिन्हें पढ़ा जा सकता है, लिखा जा सकता है और आगे बढ़ सकते हैं) बिडरेक्शनल इटरेटर्स (जो फॉरवर्ड इटरेटर्स की तरह हैं, लेकिन पीछे की ओर भी जा सकते हैं) औरs (जो एक ऑपरेशन में कितनी भी संख्या में स्वतंत्र रूप से स्थानांतरित हो सकता है)।

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

इटरेटर प्रमुख विशेषताएं हैं जो एसटीएल की व्यापकता की अनुमति देते हैं। उदाहरण के लिए, एक अनुक्रम को उलटने के लिए एक एल्गोरिथ्म को द्विदिश पुनरावृत्तियों का उपयोग करके लागू किया जा सकता है, और फिर उसी कार्यान्वयन का उपयोग सूचियों, वैक्टर और डेक पर किया जा सकता है। उपयोगकर्ता द्वारा बनाए गए कंटेनर (डेटा संरचना) को केवल एक पुनरावर्तक प्रदान करना है जो पांच मानक पुनरावर्तक इंटरफेस में से एक को लागू करता है, और एसटीएल में प्रदान किए गए सभी एल्गोरिदम कंटेनर पर उपयोग किए जा सकते हैं।

यह व्यापकता कई बार कीमत पर भी आती है। उदाहरण के लिए, किसी सहयोगी कंटेनर जैसे मानचित्र या सेट पर खोज करना कंटेनर द्वारा प्रदान किए गए सदस्य कार्यों को कॉल करने की तुलना में पुनरावृत्तियों का उपयोग करके बहुत धीमा हो सकता है। ऐसा इसलिए है क्योंकि एक साहचर्य कंटेनर के तरीके आंतरिक संरचना के ज्ञान का लाभ उठा सकते हैं, जो कि पुनरावृत्तियों का उपयोग करने वाले एल्गोरिदम के लिए अपारदर्शी है।

एल्गोरिदम
एसटीएल में खोज और छँटाई जैसी गतिविधियों को करने के लिए बड़ी संख्या में एल्गोरिदम प्रदान किए जाते हैं, प्रत्येक को एक निश्चित स्तर के इटरेटर की आवश्यकता होती है (और इसलिए किसी भी कंटेनर पर काम करेगा जो पुनरावृत्तियों द्वारा एक इंटरफ़ेस प्रदान करता है)। एल्गोरिदम खोज रहे हैं जैसे और  बाइनरी सर्च एल्गोरिथम का उपयोग करें और सॉर्टिंग एल्गोरिदम की तरह ही यह आवश्यक है कि डेटा के प्रकार को तुलना ऑपरेटर को लागू करना चाहिए  या कस्टम तुलनित्र फ़ंक्शन निर्दिष्ट होना चाहिए; ऐसे तुलना ऑपरेटर या तुलनित्र फ़ंक्शन को सख्त कमजोर ऑर्डरिंग की गारंटी देनी चाहिए। इनके अलावा, तत्वों की एक श्रृंखला से ढेर बनाने के लिए एल्गोरिदम प्रदान किए जाते हैं, तत्वों की एक श्रेणी के लेक्सिकोग्राफिक रूप से क्रमबद्ध क्रमपरिवर्तन उत्पन्न करते हैं, क्रमबद्ध श्रेणियों को मर्ज करते हैं और संघ (सेट सिद्धांत), इंटरसेक्शन (सेट सिद्धांत), क्रमबद्ध श्रेणियों का अंतर सेट करते हैं।

कार्य
एसटीएल में वे वर्ग शामिल हैं जो फ़ंक्शन कॉल ऑपरेटर को ओवरलोड करते हैं. ऐसी कक्षाओं के उदाहरणों को फ़ंक्टर या समारोह वस्तुओं कहा जाता है। फ़ंक्टर संबंधित फ़ंक्शन के व्यवहार को पैरामीटराइज़ करने की अनुमति देते हैं (उदाहरण के लिए फ़ंक्टर के कंस्ट्रक्टर (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग) को पास किए गए तर्कों के माध्यम से) और फ़ंक्शन के साथ संबद्ध प्रति-फ़ंक्टर राज्य की जानकारी रखने के लिए उपयोग किया जा सकता है। चूंकि फ़ंक्शन कॉल के सिंटैक्स का उपयोग करके फ़ंक्टर और फ़ंक्शन पॉइंटर्स दोनों को लागू किया जा सकता है, वे टेम्प्लेट के तर्कों के रूप में विनिमेय होते हैं जब संबंधित पैरामीटर केवल फ़ंक्शन कॉल संदर्भों में दिखाई देता है।

एक विशेष रूप से सामान्य प्रकार का फ़ंक्टर विधेय (कंप्यूटर प्रोग्रामिंग) है। उदाहरण के लिए, एल्गोरिदम जैसे एक एकात्मक समारोह विधेय लें जो अनुक्रम के तत्वों पर संचालित होता है। एल्गोरिदम जैसे सॉर्ट, आंशिक_सॉर्ट, nth_element और सभी सॉर्ट किए गए कंटेनर (डेटा संरचना) एक बाइनरी फ़ंक्शन का उपयोग करते हैं जो एक सख्त कमजोर क्रम प्रदान करना चाहिए, अर्थात, यह एक सकर्मक, गैर-रिफ्लेक्सिव और असममित बाइनरी संबंध पर एक सेट सदस्यता परीक्षण की तरह व्यवहार करना चाहिए।. यदि कोई आपूर्ति नहीं की जाती है, तो ये एल्गोरिदम और कंटेनर डिफ़ॉल्ट रूप से less का उपयोग करते हैं, जो बदले में कम-से-ऑपरेटर को कॉल करता है।

सी ++ कंपाइलर्स के कार्यान्वयन की गुणवत्ता
सी ++ कंपाइलर के कार्यान्वयन की गुणवत्ता (क्यूओआई) का एसटीएल (और सामान्य रूप से टेम्पलेट कोड) की उपयोगिता पर बड़ा प्रभाव पड़ता है:
 * टेम्प्लेट से जुड़े त्रुटि संदेश बहुत लंबे और समझने में कठिन होते हैं। इस समस्या को इतना गंभीर माना गया है कि कई उपकरण लिखे गए हैं जो एसटीएल से संबंधित त्रुटि संदेशों को सरल और सुंदर प्रिंट करते हैं ताकि उन्हें और अधिक बोधगम्य बनाया जा सके।
 * टेम्प्लेट के लापरवाह उपयोग से कोड ब्लोट हो सकता है। इसे एसटीएल कार्यान्वयन के भीतर विशेष तकनीकों के साथ काउंटर किया गया है (उदाहरण के लिए शून्य * कंटेनर आंतरिक रूप से और अन्य आहार टेम्पलेट तकनीकों का उपयोग करना) और कंपाइलर्स की अनुकूलन तकनीकों में सुधार करना। हालांकि, यह लक्षण एक अलग प्रकार के साथ काम करने के लिए कार्यों के एक सेट को भोलेपन से मैन्युअल रूप से कॉपी करने के समान है, जिसमें देखभाल और अच्छी तकनीक से दोनों से बचा जा सकता है।
 * टेंपलेट इन्स्टेन्शियशन संकलन समय और मेमोरी उपयोग को बढ़ा सकता है, बदले में आमतौर पर रनटाइम निर्णय लेने को कम करता है (उदाहरण के लिए आभासी कार्यों के माध्यम से)। जब तक कंपाइलर तकनीक में पर्याप्त सुधार नहीं हो जाता, तब तक इस समस्या को सावधानीपूर्वक कोडिंग, कुछ मुहावरों से परहेज करके, और जहां वे उपयुक्त नहीं हैं या जहां संकलन-समय के प्रदर्शन को प्राथमिकता दी जाती है, वहां टेम्प्लेट का उपयोग न करके केवल आंशिक रूप से समाप्त किया जा सकता है।

अन्य मुद्दे

 * स्रोत कोड के भीतर स्थिरांक के साथ एसटीएल कंटेनर (डेटा संरचना) का प्रारंभ करना उतना आसान नहीं है जितना कि सी से विरासत में मिली डेटा संरचनाएं ( सी ++ 11 में सी++11#प्रारंभिक सूचियों के साथ संबोधित)।
 * एसटीएल कंटेनरों को बेस क्लास के रूप में इस्तेमाल करने का इरादा नहीं है (उनके विध्वंसक जानबूझकर गैर-आभासी हैं); एक कंटेनर से प्राप्त करना एक सामान्य गलती है।
 * एसटीएल द्वारा लागू किए गए पुनरावर्तकों की अवधारणा (जेनेरिक प्रोग्रामिंग) को पहले समझना मुश्किल हो सकता है: उदाहरण के लिए, यदि इटरेटर द्वारा इंगित मान हटा दिया जाता है, तो इटरेटर स्वयं मान्य नहीं होता है। यह त्रुटियों का एक सामान्य स्रोत है। एसटीएल के अधिकांश कार्यान्वयन एक डीबग मोड प्रदान करते हैं जो धीमा है, लेकिन उपयोग किए जाने पर ऐसी त्रुटियों का पता लगा सकता है। इसी तरह की समस्या अन्य भाषाओं में मौजूद है, उदाहरण के लिए जावा (प्रोग्रामिंग भाषा)। रेंज (कंप्यूटर साइंस) # रेंज को इटरेटर के विकल्प के रूप में एक सुरक्षित, इटरेटर के लिए अधिक लचीला विकल्प के रूप में प्रस्तावित किया गया है।
 * कुछ पुनरावृति पैटर्न STL इटरेटर मॉडल में मैप नहीं होते हैं। उदाहरण के लिए, कॉलबैक एन्यूमरेशन एपीआई को कोरटाइन के उपयोग के बिना एसटीएल मॉडल में फिट करने के लिए नहीं बनाया जा सकता है, जो प्लेटफ़ॉर्म-निर्भर या अनुपलब्ध हैं, और C++ मानक के बाहर C++20 तक होंगे।
 * कंपाइलर अनुपालन गारंटी नहीं देता है कि कंटेनर (डेटा संरचना) के लिए स्मृति प्रबंधन के लिए उपयोग किए जाने वाले आवंटक (सी ++)सी ++) ऑब्जेक्ट्स राज्य-निर्भर व्यवहार के साथ काम करेंगे। उदाहरण के लिए, एक पोर्टेबल लाइब्रेरी एक एलोकेटर प्रकार को परिभाषित नहीं कर सकती है जो उस प्रकार के विभिन्न एलोकेटर ऑब्जेक्ट्स का उपयोग करके विभिन्न पूलों से मेमोरी खींचेगा। (मेयर्स, पृ. 50) (सी++11 में संबोधित)।
 * एल्गोरिदम का सेट पूरा नहीं हुआ है: उदाहरण के लिए, एल्गोरिथ्म छोड़ दिया गया था, हालाँकि इसे C++ 11 में जोड़ा गया है।

कार्यान्वयन

 * स्टेपानोव और ली द्वारा मूल एसटीएल कार्यान्वयन। 1994, हेवलेट पैकर्ड अब नहीं रखा जाता।
 * एसजीआई एसटीएल, स्टेपानोव और ली द्वारा मूल कार्यान्वयन पर आधारित। 1997, सिलिकॉन ग्राफिक्स। अब नहीं रखा जाता।
 * STLपोर्ट, SGI STL पर आधारित है
 * दुष्ट दुष्ट लहर सॉफ्टवेयरHP, SGI, SunSoft, Inc., Siemens-Nixdorf)
 * Apache C++ Standard Library (इस पुस्तकालय के लिए प्रारंभिक बिंदु दुष्ट वेव मानक पुस्तकालय का 2005 संस्करण था )
 * पी.जे. प्लॉगर द्वारा डिंकम एसटीएल पुस्तकालय
 * Microsoft STL जो Visual C++ के साथ आता है, Dinkum's STL का लाइसेंस प्राप्त व्युत्पन्न है। स्रोत Github पर उपलब्ध है।
 * EASTL, इलेक्ट्रॉनिक आर्ट्स में पॉल पेड्रियाना द्वारा विकसित और [http://gpl के हिस्से के रूप में प्रकाशित .ea.com/ ईए ओपन सोर्स]।

यह भी देखें

 * सी ++ टेम्पलेट पुस्तकालयों की सूची
 * सी ++ 11
 * सी ++ पुस्तकालयों को बढ़ावा दें

संदर्भ

 * Alexander Stepanov and Meng Lee, The Standard Template Library. HP Laboratories Technical Report 95-11(R.1), 14 November 1995. (Revised version of A. A. Stepanov and M. Lee: The Standard Template Library, Technical Report X3J16/94-0095, WG21/N0482, ISO Programming Language C++ Project, May 1994.)
 * Stepanov reflects about the design of the STL.

बाहरी संबंध

 * C++ reference
 * C++ STL reference, includes C++11 features
 * STL programmer's guide from SGI. Originally at (retired content).
 * Apache (formerly Rogue Wave) C++ Standard Library Class Reference
 * Apache (formerly Rogue Wave) C++ Standard Library User Guide
 * Bjarne Stroustrup on The emergence of the STL (Page 5, Section 3.1)
 * C++ Standard Specification