Кіріспе

C++ бағдарламалау тілі үшін бағдарламалық кітапхана.

Стандартты үлгі кітапханасы (STL) – бастапқыда Александр Степанов C++ бағдарламалау тілі үшін жасаған бағдарламалық кітапхана, ол C++ стандартты кітапханасының көптеген бөліктеріне әсер етті. Ол алгоритмдер, контейнерлер, функциялар және итераторлар деп аталатын төрт компоненттен тұрады. STL C++ үшін контейнерлер мен ассоциативтік массивлер сияқты, кез келген кіріктірілген типпен және көшіру және тапсыру сияқты негізгі операцияларды қолдайтын кез келген пайдаланушы анықтаған типпен пайдалануға болатын жалпы кластар жиынтығын ұсынады. STL алгоритмдері контейнерлерден тәуелсіз, бұл кітапхананың күрделілігін едәуір төмендетеді. STL үлгілерді пайдалану арқылы нәтижелерге жетеді. Бұл тәсіл, әдетте, орындалу кезіндегі полиморфизмге қарағанда тиімдірек, компиляция кезіндегі полиморфизмді қамтамасыз етеді. Қазіргі заманғы C++ компиляторлары STL-ді кеңінен пайдаланудан туындайтын абстракция салдарынан туындаған шығындарды азайтуға бағытталған. STL C++ үшін жалпы алгоритмдер мен деректер құрылымдарының алғашқы кітапханасы ретінде құрылды, онда төрт негізгі идея болды: жалпы бағдарламалау, тиімділікті жоғалтпай абстракция, фон Нейманның есептеу моделі және мәндік семантика. STL және C++ стандартты кітапханасы – екі бөлек құрал.

Тарих

1993 жылдың қараша айында Александр Степанов C++ стандартына қатысты ANSI/ISO комитетіне жалпылама бағдарламалау негізіндегі кітапхананы ұсынды. Комитет бұл ұсынысқа өте жағымды жауап берді, содан кейін Эндрю Кениг 1994 жылдың наурыз айындағы жиналысқа дейін ресми ұсыныс беруді сұрады. Комитет өзгерістер мен кеңейтулер бойынша бірнеше сұраулар жіберді, сондай-ақ комитет мүшелері Степанов пен Мэн Лимен кездесіп, мәліметтерді нақтылады. Ең маңызды кеңейтудің (әрекеттес контейнерлер) талаптары толыққанды іске асырылған жағдайда ғана сәйкес келетінін көрсету қажет болды, бұл міндетті Степанов Дэвид Муссерге жүктеді. 1994 жылдың шілдесінде ANSI/ISO комитетінің отырысында ұсынысқа соңғы мақұлдау берілді. Содан кейін Степанов пен Лидің 17 нөміріндегі құжаты ANSI/ISO C++ стандартының жобасына (1-ден 27-ге дейінгі тараулардың 1-бөлігі) қосылды. STL-дің кеңінен таралу мүмкіндігі Hewlett Packard компаниясының 1994 жылдың тамызында оның іске асырылуын интернетте тегін қолжетімді ету туралы шешім қабылдауымен едәуір жақсарды. Бұл іске асырылу, стандарттау процесінде Степанов, Ли және Муссердің бірлесіп жасаған еңбегі, бүгінде көптеген компилятор және кітапхана жеткізушілері ұсынатын іске асырылулардың негізіне айналды.

Алгоритмдер

Іздеу және сұрыптау сияқты амалдарды орындау үшін STL-де көптеген алгоритмдер ұсынылады, олардың әрқайсысы белгілі бір деңгейдегі итераторды қажет етеді (сондықтан итераторлар арқылы интерфейс ұсынатын кез келген контейнермен жұмыс істейді). Екілік іздеуді пайдаланатын және ұқсас сұрыптау алгоритмдері сияқты іздеу алгоритмдері дерек түрінің салыстыру операторын немесе қолданушыға арналған салыстыру функциясын қажет етеді; мұндай салыстыру операторы немесе салыстыру функциясы қатаң әлсіз реттілікке кепілдік беруі керек. Бұлардан басқа, элементтер тізбегінен қалыпты үйінді жасау, элементтер тізбегінің лексикографиялық реттелген түрленімдерін жасау, сұрыпталған диапазонды біріктіру және сұрыпталған диапазонның біріктіру, қиылысу, айырмасын орындау үшін алгоритмдер ұсынылады.

Функторлар

STL функцияны шақыру операторын жүктемелі жасайтын кластарды қамтиды. Мұндай кластардың мысалдары функторлар немесе функциялық объектілер деп аталады. Функторлар байланысты функцияның әрекетін параметрлеуге мүмкіндік береді (мысалы, функтордың конструкторына берілген аргументтер арқылы) және функциямен бірге функторға қатысты күй туралы ақпаратты сақтауға қолданылады. Функторлар мен функциялық нұсқаулардың екеуі де функцияны шақыру синтаксисі арқылы шақырыла алатындықтан, тиісті параметр функция шақыру контекстінде ғана пайда болған жағдайда, оларды шаблон аргументтері ретінде алмастыруға болады. Функтордың ең көп тараған түрі – предикат. Мысалы, алгоритмдер тізбек элементтерімен жұмыс жасайтын унарлы предикатты қабылдайды. Сорттау, ішінара сұрыптау, n-інші элемент және барлық сұрыпталған контейнерлер сияқты алгоритмдер қатаң әлсіз реттілік қамтамасыз ететін екілік предикатты пайдаланады, яғни ол транзитивті, рефлексивті емес және асимметриялық екілік қатынаста мүшелік тестілеу сияқты жұмыс істеуі керек. Егер ештеңе берілмесе, бұл алгоритмдер мен контейнерлер әдепкі бойынша `less` операторын пайдаланады, ол өз кезегінде `<` операторын шақырады.

Басқа мәселелер

STL контейнерлерін бастапқы кодтағы тұрақтылармен инициализациялау C-ден мұрагерлік алған дерек құрылымдары сияқты оңай емес (C++11 инициализатор тізімдерімен шешілді). STL контейнерлері базалық сыныптар ретінде қолдануға арналмаған (олардың деструкторлары қасақана виртуалды емес); контейнерден туындату – жиі кездесетін қателік. STL іске асырған итераторлар тұжырымын бастапқыда түсіну қиын болуы мүмкін: мысалы, егер итератор көрсеткен мән жойылса, итератордың өзі жарамсыз болады. Бұл қателердің кең таралған себебі. STL-дің көптеген іске асырылымдары баяурақ, бірақ осындай қателерді анықтай алатын жөндеу режимін ұсынады. Осындай мәселе басқа тілдерде де бар, мысалы Java. Итераторларға қарағанда қауіпсіз және икемді балама ретінде диапазондар ұсынылған. Кейбір итерация үлгілері, мысалы, кері шақыру санама API-лары, C++20-ға дейін C++ стандартынан тыс болған корутиналарды қолданбастан STL моделіне сәйкес келмейді. Компилятордың сәйкестігі контейнерлер үшін жад басқаруға қолданылатын Allocator объектілерінің күйге тәуелді әрекеттерімен жұмыс істейтініне кепілдік бермейді. Мысалы, портативті кітапхана әртүрлі жад қоймаларынан жадты алу үшін әртүрлі Allocator объектілерін пайдаланатын Allocator түрін анықтай алмайды. (Meyers, 50 б.) (C++11-де қарастырылған). Алгоритмдер жиынтығы толық емес: мысалы, алгоритм алынып тасталды, бірақ ол C++11-де қосылды.