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

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

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

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

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

इस प्रकार हम कह सकते हैं कि एसटीएल और सी ++ मानक लाईब्रेरी दो अलग-अलग संस्थाएं हैं।

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

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

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

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

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

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

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

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

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

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

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

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

अन्य विवाद

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

कार्यान्वयन

 * स्टेपानोव और ली द्वारा मूल एसटीएल कार्यान्वयन। 1994, हेवलेट पैकर्ड अब नहीं रखा जाता।
 * एसजीआई एसटीएल, स्टेपानोव और ली द्वारा मूल कार्यान्वयन पर आधारित। 1997, सिलिकॉन ग्राफिक्स। अब नहीं रखा जाता।
 * एसटीएलपोर्ट, SGI एसटीएल पर आधारित है
 * दुष्ट दुष्ट लहर सॉफ्टवेयरएचपी, एसजीआई, सनसाॅफ्ट, इंक, सिमेंस-निक्सडार्फ)
 * अपाचो सी++ मानक लाइब्रेरी (इस लाईब्रेरी के लिए प्रारंभिक बिंदु दुष्ट वेव मानक लाईब्रेरी का 2005 संस्करण था )
 * पी.जे. प्लॉगर द्वारा डिंकम एसटीएल लाईब्रेरी का उपयोग होता हैं।
 * माइक्रोसाॅफ्ट एसटीएल जो विजुअल सी++ के साथ आता है, डिनकुम्स एसटीएल का लाइसेंस प्राप्त व्युत्पन्न है। स्रोत गिटहब पर उपलब्ध होते हैं।
 * ईएएसटीएल, इलेक्ट्रॉनिक आर्ट्स में पॉल पेड्रियाना द्वारा विकसित और [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.

बाहरी संबंध

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