ГЛАВА 14 – Стандартната библиотека с шаблони на С++
Едно от главните постижения които станаха през стандартизационния процес на С++ беше включването на стандартната библиотека с шаблони или STL . STL предоставя общо предназначени , шаблонни класове и функции които изпълняват множество популярни и общо използвани алгоритми и структури за данни . Например , тя включва поддръжка на вектори , списъци , опашки и стекове . Тя също дефинира и разнообразни начини за достъп до тях . Понеже STL е изградена от шаблонни класове , алгоритмите и структурите за данни могат да бъдат приложени към почти всеки тип данни . STL е голяма библиотека и не всички от нейните качества могат да бъдат пълно описани в тази книга . Също версията на STL описана тук е тази определена от стандартизационния комитет ANSI / ISO . Вашия компилатор може да предоставя по – различна версия на STL , така че трябва да проверите неговата документация .
Преглед на контейнери , алгоритми и итератори
STL е съставена от три компонента : контейнери , алгоритми и итератори . Те работят заедно за да доставят основни решения за разнообразни програмни проблеми . Всеки е описан кратко тук .
Контейнери
Контейнерите са обекти които съдържат други обекти . Има няколко различни типа контейнери . Например класа vector дефинира динамичен масив , queue създава опашка и list изгражда линеен списък . В добавка към основните контейнери STL също дефинира и асоциативни контейнери които позволяват ефикасно получаване на стойности базирани на ключове . Например , map доставя достъп до стойности с уникални ключове . По този начин map съхранява двойк ключ / стойост и позволява стойността да бъде върната чрез подаване на нейния ключ . Всеки контейнерен клас дефинира множество от функции които могат да бъдат приложени към контейнера . Например , list контейнера включва функции които вмъкват , изтриват и сливат елементи .
Алгоритми
Алгоритмите действат върху контейнерите . Те включват възможности за инициализиране , сортиране , претърсване и преобразуванена съдържанието на контейнерите . Много алгоритми действат в последователност , което е линеен списък от елементи в контейнера .
Итератори
Итераторите са обекти които са повече или по – малко указатели . Те дават възможност да имаме достъп до съдържанието на контейнер по много подобен начин при който използваме указател за достъп до масив . Има 5 типа итератори :
Итератор Разрешен достъп
Произволен достъп Съхранява и извлича стойности; елементите могат да бъдат
достъпвани произволно
Двупосочен Съхранява и извлича стойности;
движение напред и назад
Прав Съхранява и извлича стойности;
движение само напред
Входен Извлича , но не съхранява стойности ; движение само напред
Изходен Съхранява , но не извлича стойности ; движение само напред
Най – общо итератор който има най – големи възможности за достъп може да бъде използван на мястото на такъв със по – малки възможности . Например правия итератор може да бъде използван на мястото на входния . Итераторите се манипулират като указатели . Може да се увеличават и намаляват . Може да се прилага оператора * към тях . Итераторите са декларирани чрез използване на типа iterator дефиниран за различни контейнери . Когато се отнася за различните типове контейнери общо , тази книга използва следните имена :
Име Представя
BiIter Двупосочен итератор
ForIter Прав итератор
InIter Входен итератор
OutIter Изходен итератор
RandIter Итератор с произволен
достъп
STL също поддържа и обратни итератори . Обратните итератори са или двупосочни или с произволен достъп които се преместват в последователност в обратна посока . Така ако обратния итератор сочи края на поредицата , увеличавайки го ще предизвикаме той да сочи към един елемент преди края .
Алокатори
Всеки контейнер дефинира за себе си алокатор , който е обект от клас allocator . Алокаторите управляват заделянето на памет когато се създава нов контейнер
Някои от алгоритмите и контейнерите използват специален тип функции наречени предикати . Има две вариации на предикатите - унарни и бинарни . Унарния предикат приема един аргумент . Бинарния приема два аргумента . Тези функции връщат резултат true / false . Но точното условие което ги кара да върнат true или false се дефинира от вас . В следващите описания , когато се изисква унарна предикатна функция , тя ще се означава чрез типа UnPred . Когато се изисква бинарен предикат ще използваме типа BinPred . В бинарния предикат , аргументите са винаги в ред първи , втори отнасящи се за функцията която извиква предиката . И за двата предиката , аргументите ще съдържат стойности от типа на обектите които се съхраняват в контейнер . Някои алгоритми и класове използват специален тип бинарен предикат който сравнява два елемента . Сравняващите функции връщат true ако техния първи аргумент е по – малък от втория . Сравняващите функции ще ги представяме чрез типа comp .
Инструменти и функционални хедъри
В добавка към хедърите изисквни от различните класове на STL стандартната библиотека на С++ включва < utility > и < functional > хедъри , които доставят поддръжка за STL . Например в < utility > е дефиниран шаблонния клас pair , който може да съдържа двойка от стойности . Шаблонната функция less ( ) декларирана във < functional > определя кога един обект е по – малък от друг . Шаблоните във < functional > ви позволяват да изградите обекти които дефинират operator( ) . Те са наречени функционални обекти и могат да бъдат използвани на мястото на указателите към функции на много места . Те са извън обсега на този бърз справочник за да ги описваме .
Сподели с приятели: |