സ്റ്റാൻഡേർഡ് ടെമ്പ്ലേറ്റ് ലൈബ്രറി (സി++)

സി++ പ്രോഗ്രാമിങ് ഭാഷയിലെ പ്രധാനപ്പെട്ട ഒരു ഭാഗം ആണ് എസ്.ടി.എൽ (S.T.L) എന്ന് വിളിയ്ക്കപ്പെടുന്ന സ്റ്റാൻഡേർഡ് ടെമ്പ്ലേറ്റ് ലൈബ്രറി. സി++'ലെ തന്നെ സ്റ്റാൻഡേർഡ് ലൈബ്രറിയുടെ ഡിസൈനിനെ എസ്.ടി.എൽ വളരെ സ്വാധീനിച്ചിട്ടുണ്ട്. ഇതിനെ അൽഗോരിതങ്ങൾ, കണ്ടെയ്നറുകൾ, ഫങ്ക്ഷൻ ഒബ്ജക്റ്റുകൾ, ഇറ്ററേറ്ററുകൾ എന്നീ നാല് ഭാഗങ്ങളായി വിഭജിച്ചിരിയ്ക്കുന്നു. ഇത് ഒരു സി++ പ്രോഗ്രാമർക്ക് അത്യാവശ്യം വേണ്ട നാല് തരം സേവനങ്ങൾ നൽകുന്നു.

എസ്.ടി.എൽ നൽകുന്ന കണ്ടെയ്നറുകൾ ഒരു കൂട്ടം ഒബ്ജക്റ്റുകളെ ശേഖരിച്ചു സൂക്ഷിയ്ക്കാനുള്ള ക്ലാസ്സുകളാണ്. ഈ ഒബ്ജക്റ്റുകൾ എന്നത് സി++ തന്നെ തരുന്ന അടിസ്ഥാന ടൈപ്പ് (built-in types) ഒബ്ജക്റ്റുകൾ ആകാം (ഇന്റെജർ, സ്ട്രിംഗ് തുടങ്ങിയവ). അല്ലെങ്കിൽ ഒരു ഉപഭോക്താവ്‌ തന്നെ ഉണ്ടാക്കിയെടുത്ത ക്ലാസ്സിന്റെ (user defined types) ടൈപ്പിലുള്ള ഒബ്ജക്റ്റുകൾ ആകാം. രണ്ടാമത്തെ ടൈപ്പ് ക്ലാസ്സുകളാണ് ഉപയോഗിയ്ക്കുന്നതെങ്കിൽ അവയിൽ കോപ്പി ചെയ്യാനും അസൈൻ ചെയ്യാനുമുള്ള ചില അടിസ്ഥാന ഫങ്ക്ഷനുകൾ ഉണ്ടായിരിയ്ക്കണം (കോപ്പി കോൺസ്ട്രക്ടർ, അസൈൻമെന്റ് ഓപ്പറേറ്റർ തുടങ്ങിയവ). ഈ കണ്ടെയ്നറുകളിൽ പ്രവർത്തിയ്ക്കുന്ന അൽഗോരിതങ്ങൾ വേറെ ക്ലാസുകൾ ആയി ഡിസൈൻ ചെയ്തിരിയ്ക്കുന്നു. ഈ ഡിസൈൻ എസ്.ടി.എൽ'ന്റെ സങ്കീർണ്ണത വളരെ കുറയ്ക്കാൻ സഹായിയ്ക്കുന്നു.

എസ്.ടി.എൽ പ്രധാനമായും സി++ ടെമ്പ്ലേറ്റുകൾ അടിസ്ഥാനപ്പെടുത്തിയാണ് രൂപകൽപന ചെയ്തിരിയ്ക്കുന്നത്. ഈ ഡിസൈൻ കമ്പൈൽ സമയ പോളിമോർഫിസം നൽകുന്നു. ഇത് റൺ ടൈം പോളിമോർഫിസത്തേക്കാൾ കൂടുതൽ വേഗതയുള്ളതാണ്. സി++'ൽ ക്ലാസ്സുകളുടെ ഉപയോഗം കൊണ്ടുവരുന്ന വേഗതക്കുറവിനെ ഒരു പരിധി വരെ ഈ ഡിസൈനും ഒരു വിധം കമ്പൈലറുകളുടെ കമ്പൈൽ സമയ ഒപ്റ്റിമൈസഷനും സഹായിയ്ക്കുന്നു..

## ഭാഗങ്ങൾ

### കണ്ടെയ്നറുകൾ
എസ്.ടി.എൽ അനുക്രമ കണ്ടെയ്നറുകളും (sequence containers) സാഹചര്യ കണ്ടെയ്നറുകളും (associative containers) നൽകുന്നു. മറ്റു ഒബ്ജക്റ്റുകളെ ശേഖരിച്ചു സൂക്ഷിയ്ക്കുന്ന ക്ലാസ്സുകളാണ് കണ്ടെയ്നറുകൾ. അനുക്രമ കണ്ടെയ്നർ (sequence container) എന്നാൽ അതിലെ അംഗങ്ങൾക്ക് ഒരു നിശ്ചിത സ്ഥാനം കാണും. ഇത് കണ്ടെയ്നറിലേയ്ക്ക് അംഗം ഇട്ട സമയമോ സ്ഥാനമോ അനുസരിച്ചു ഇരിയ്ക്കും. പക്ഷെ ഒരിയ്ക്കലും അംഗത്തിന്റെ വിലയുമായി ബന്ധപ്പെട്ടല്ല ഈ സ്ഥാനം. സാഹചര്യ കണ്ടെയ്നർ (associative container) എന്നാൽ അതിലെ അംഗങ്ങളുടെ സ്ഥാനം അവയുടെ വിലയെ അടിസ്ഥാനപ്പെടുത്തി ഇരിയ്ക്കും. അതിനാൽ ഇത്തരം കണ്ടെയ്നറുകളിൽ ഇടുന്ന അംഗങ്ങളെ തമ്മിൽ താരതമ്യപ്പെടുത്താനായി അവയിൽ ഒരു താരതമ്യ ഓപ്പറേറ്റർ അത്യാവശ്യമാണ്.

വെക്ടർ(), ഡീക്യൂ(), ലിസ്റ്റ് () എന്നിവയാണ് അനുക്രമ കണ്ടെയ്നറുകൾ. സെറ്റ്( ), മൾട്ടി സെറ്റ്( ), മാപ് ), മൾട്ടി മാപ്(), ഹാഷ് സെറ്റ്(), ഹാഷ് മാപ്( ), ഹാഷ് മൾട്ടി സെറ്റ്( ) ഹാഷ് മൾട്ടി മാപ്( ) എന്നിവയാണ് സാഹചര്യ കണ്ടെയ്നറുകൾ.ഇത്തരം കണ്ടെയ്നറുകളെ അടിസ്ഥാനപ്പെടുത്തി നിർമിച്ച എന്ന വ്യത്യസ്ത ഇന്റർഫേസ് നൽകുന്ന ക്യൂ( ), പ്രിയോറിറ്റി ക്യൂ(), സ്റ്റാക്ക്()എന്നീ കണ്ടെയ്നർ അഡാപ്റ്ററുകളും എസ്.ടി.എൽ നൽകുന്നു. .

### ഇറ്ററേറ്ററുകൾ
ഒരു കണ്ടെയ്നറിലെ വിലകളെ വീണ്ടെടുക്കാനും അവയെ മാറ്റാനും വേണ്ടി അവയെ ഒന്നിനു പിറകെ മറ്റൊന്നായി സന്ദർശിയ്ക്കാനുള്ള ഒരു വിദ്യയാണ് ഇറ്ററേറ്റർ (iterator). ഒരു സാധാരണ സി അടുക്കിന്റെ സ്ഥാനാങ്കം (index) എന്ന ആശയത്തെ വിപുലപ്പെടുത്തിയതാണ് ഇത്. മുന്നോട്ടു നീങ്ങാനായി ഒരു ++ ഓപ്പറേറ്ററും അംഗത്തെ ഡീറഫറൻസ് ചെയ്തു എടുക്കാനായി ഒരു * ഓപ്പറേറ്ററുമാണ് ഒരു ഇറ്ററേറ്ററിന്റെ പ്രധാന ഫങ്ക്ഷനുകൾ.
എസ്.ടി.എൽ അഞ്ചുതരത്തിലുള്ള ഇറ്ററേറ്ററുകൾ നൽകുന്നു.

* ഇന്പുട് ഇറ്ററേറ്ററുകൾ  : ഒരു കൂട്ടം വിലകളുടെ അനുക്രമത്തിൽ (sequence) നിന്നും വായിയ്ക്കാൻ മാത്രം ഉപയോഗിയ്ക്കുന്നവ 
* ഔട്ട്പുട്ട് ഇറ്ററേറ്ററുകൾ  : ഒരു കൂട്ടം വിലകളുടെ അനുക്രമത്തിലേക്ക് (sequence) എഴുതാൻ മാത്രം ഉപയോഗിയ്ക്കുന്നവ
* ഫോർവേഡ് ഇറ്ററേറ്ററുകൾ  : വായിയ്ക്കാനും, എഴുതാനും, മുന്നോട്ടേക്ക് നീക്കാനും പറ്റുന്നവ.
* ബൈ ഡൈറെക്ഷണൽ ഇറ്ററേറ്ററുകൾ  : വായിയ്ക്കാനും, എഴുതാനും, മുന്നോട്ടേയ്ക്കും പിന്നോട്ടേയ്ക്കും നീക്കാനും പറ്റുന്നവ.
* റാൻഡം അക്സസ്സ് ഇറ്ററേറ്ററുകൾ  : ഒറ്റതവണ തന്നെ എത്ര സ്റ്റെപ് വേണമെങ്കിലും നീക്കാൻ പറ്റുന്നവ.
 

### അൽഗോരിതങ്ങൾ
കണ്ടെയ്നറുകളിൽ പ്രവർത്തിയ്ക്കുന്ന ഒരു സാധാരണ പ്രോഗ്രാമർക്ക് ആവശ്യമുള്ള ഫങ്ക്ഷനുകളുടെ ഒരു കൂട്ടം ആണിത്.തിരയൽ (search), ക്രമീകരണം (sorting) അങ്ങനെ സാധാരണ ഉപയോഗിയ്ക്കാനുള്ള പല അൽഗോരിതങ്ങളും എസ്.ടി.എൽ തരുന്നു. സങ്കീർണ്ണത കുറയ്ക്കാനായി ഇവയെ കണ്ടെയ്നറുകളിൽ നിന്ന് വേർപെടുത്തി സ്വതന്ത്രമായ ക്ലാസുകൾ ആയാണ് എസ്.ടി.എൽ'ൽ രൂപീകരിച്ചിരിയ്ക്കുന്നത്. ഇത് പൊതുവേ ഒബ്ജക്റ്റ് ഓറിയന്റഡ് പ്രോഗ്രാമിങിന്റെ ഡാറ്റയും അതിൽ പ്രവർത്തിയ്ക്കുന്ന ഫങ്ക്ഷനുകളെയും ഒരുമിച്ചു വയ്ക്കുക എന്ന അടിസ്ഥാന തത്ത്വത്തിന് എതിരായാണ് ഡിസൈൻ ചെയ്തിരിയ്ക്കുന്നത്. എങ്കിലും ഈ ഡിസൈൻ എസ്.ടി.എൽ'ന്റെ പൊതുവെയുള്ള സങ്കീർണ്ണത കുറയ്ക്കുകയും പുനരുപയോഗം വർദ്ധിപ്പിയ്ക്കുകയും ചെയ്യുന്നു.

പൊതുവേ ഈ അൽഗോരിതങ്ങൾ ഒരു കണ്ടെയ്നർ ക്ലാസ് ഇന്പുട് ആയി എടുക്കുന്നതിനുപകരം അതിന്റെ ഇറ്ററേറ്റർ ആണ് എടുക്കുക.

## ചരിത്രം
അലക്സാണ്ടർ സ്റ്റെപ്പാണോവ് ആണ് ഇതിന്റെ ഉപജ്ഞാതാവ്. 1979 ൽ ജനറിക് പ്രോഗ്രാമിങ് എങ്ങനെ ചെയ്യാം എന്ന അദ്ദേഹത്തിന്റെ അന്വേഷണമാണ് എസ്.ടി.എൽ'ന്റെ രൂപവൽക്കരണത്തിൽ കലാശിച്ചത്. 1994 ൽ ആണ് ഇതിന്റെ ആദ്യ പ്രൊപോസൽ പുറത്തു വരുന്നത്. എന്നാൽ ഇത് സി++'ൽ നിന്നും വ്യത്യസ്തമായ ഒരു ലൈബ്രറി ആയിട്ടാണ് നിർദ്ദേശിയ്ക്കപ്പെട്ടത്. ഹ്യുലെറ്റ്-പക്കാർഡ് 1994 ൽ ഇത് ഒരു ഫ്രീ ലൈബ്രറി ആയി ഇൻറർനെറ്റിൽ പബ്ലിഷ് ചെയ്തു. സ്റ്റെപ്പാണോവ് തന്നെയാണ് ഇതുണ്ടാക്കാനും മുഖ്യ പങ്കു വഹിച്ചത്.

## ഇവ കൂടി കാണുക

* അലോക്കേറ്റർ (സി++)

## അവലംബം

വർഗ്ഗം:സി++