Prelegeri pe c

Prelegeri pe C / C ++: Biblioteca de șabloane standard (STL)

Căpitanul Obviousness sugerează:
STL este o modalitate de a programa fără a lua algoritmi tipici

STL este o bibliotecă de șabloane standard inclusă în noile versiuni ale standardului C ++. STL oferă clase și funcții standard care implementează algoritmii și structurile de date cele mai populare și utilizate pe scară largă. STL este construit pe baza modelelor de clasă. prin urmare, algoritmii și structurile incluse în acesta sunt aplicabile aproape tuturor tipurilor de date. Miezul bibliotecii este format din trei elemente: containere, algoritmi și iteratori.
  • Containerele (recipientele) sunt obiecte destinate depozitării unui set de elemente. De exemplu, un vector, o listă liniară, un set. Containerele asociative permit utilizarea tastelor pentru a accesa rapid valorile stocate în acestea. Fiecare clasă de containere definește un set de funcții pentru a lucra cu ele. De exemplu, containerul conține funcții pentru inserarea, ștergerea și îmbinarea elementelor.
  • Algoritmii (algoritmi) efectuează operații asupra conținutului containerului. Există algoritmi pentru inițializarea, sortarea, căutarea, înlocuirea conținutului containerului. Mulți algoritmi sunt proiectați să funcționeze cu o secvență, care este o listă liniară a elementelor din interiorul containerului.
  • Iteratoarele (iteratorii) sunt obiecte care acționează ca indicatori ai containerului. Acestea vă permit să accesați conținutul unui container și să-i scanați elementele, la fel ca și pointerii utilizați pentru a accesa elementele unui tablou. Cu iteratori, puteți lucra la fel ca și indicatorii. Pentru ele puteți utiliza operațiile *, incrementarea, decrementarea. Tipul de iterator este definit în recipiente diferite.

Există cinci tipuri de iteratori:

1. Iteratoarele de intrare (iterator de intrare) sprijină operațiile de egalitate, dereferențiere și incrementare: ==. =, * i, + i, i ++, * i ++. Un caz special al unui iterator de intrare este istream_iterator.

2. Operațiile de dereferențiere a iteratorului de ieșire care sunt valide numai în partea stângă a alocării și increment: ++ i, i ++, * i = t, * i ++ = t. Un caz special al iteratorului de ieșire este ostream_iterator.

3. Iteratoarele cu unire directă (iteratorul înaintare) suportă toate operațiile iteratorilor de I / O și, în plus, permit utilizarea asignării: == fără restricții. =, *, * i, ++ i, i ++, * i.

4. Iteratorul bidirecțional are toate proprietățile iteratoarelor înainte și are, de asemenea, o operație de decontare suplimentară (-i, i--, * i), care le permite să traverseze containerul în ambele direcții.

De asemenea, STL acceptă iteratoarele inverse. Iteratoarele inverse pot fi fie iteratoare bidirecționale, fie iteratoare cu acces aleator, care trec secvența în direcția inversă.

În plus față de containere, algoritmi și iteratori, STL suportă mai multe componente standard.

Principalele sunt alocatorii de memorie, predicate și funcții de comparare.

Fiecare container are propriul alocator, care gestionează procesul de alocare a containerului. În mod implicit, alocatorul este un obiect al alocatorului de clasă. Puteți defini propriul dvs. distribuitor.

Unii algoritmi și containerele utilizează o funcție de tip special, numită predicat. Un predicat poate fi unar și binar. Valoarea returnată a predicatului este adevărată sau falsă. Condițiile exacte pentru obținerea acestei valori sunt determinate de programator. Tipul predicatelor unare UnPred, binar - BinPred. Tipul de argumente corespunde tipului de obiecte stocate în container.

Un tip special de predicat binar este definit pentru compararea a două elemente. Se numește funcția de comparare. Funcția returnează true dacă primul element este mai mic decât cel de-al doilea element. Tipul funcției este de tipul Comp:

Un rol special în STL este jucat de obiectele funcționale (functori). Obiectele de funcții sunt instanțe ale clasei în care este definită operația "paranteze" (). În unele cazuri este convenabil să înlocuiți funcția cu funcția obiect. Atunci când un obiect de funcții este folosit ca o funcție, operatorul () este folosit pentru a-l apela. Iată un exemplu complet de cod care implementează această abordare.

Exemplu 1. Înlăturarea rândurilor dintr-o listă folosind functorul.

STL definește două tipuri de containere de bază: secvențe și containere asociative. Diferența dintre ele este aceea că secvențele au aceeași ordine de elemente (vector, stack, queue), iar pentru containerele asociative - nu (matrice asociativă, set).

Ideea cheie pentru containerele standard este că ele trebuie să fie interschimbabile, dacă este rezonabil să rezolvăm problema. Utilizatorul poate alege între containere, pe baza considerentelor de eficiență și a nevoii de operațiuni specializate. De exemplu, dacă aveți nevoie frecvent să căutați o cheie, puteți utiliza harta matrice asociativă. Pe de altă parte, dacă predomină operațiunile specifice listei, puteți utiliza containerul listei de liste. Dacă adăugați sau eliminați elemente în mod normal la începutul sau la sfârșitul containerului, este necesar să utilizați coada de așteptare, coada de așteptare în două direcții sau coșul de stive. În mod implicit, utilizatorul utilizează în mod obișnuit containerul vector, fiind implementat pentru a funcționa bine pentru o gamă largă de sarcini.

Ideea de a trata cu diferite tipuri de recipiente într-un mod unitar duce la conceptul de programare generalizată. Pentru a susține această idee, STL conține mulți algoritmi generalizați gata. Astfel de algoritmi scutesc programatorul de necesitatea de a cunoaște detaliile aranjamentului intern al containerelor individuale.

Descriim pe scurt principalele caracteristici ale STL, puteți afla mai multe despre ele în ajutorul standard sau pe site-ul cplusplus.com.

Vectorul vectorial în STL este definit ca o matrice dinamică, cu acces la elementele sale prin index.

unde T este tipul de date care trebuie stocate. Alocatorul specifică alocatorul de memorie, care implicit este implicit. Clasa vectorială definește următorii constructori:

Exemple de apelare a acestor constructori:

Principiile generale de lucru cu vectorul sunt următoarele:
  • Pentru orice obiect care va fi stocat în vector, trebuie definit constructorul implicit. În plus, pentru obiect ar trebui să fie definite tag-uri de operatori: c + + educative

Articole similare