Există mult mai multe lucruri în Biblioteca Standard C ++ decât avem timp să acoperim. Ne vom limita la a privi unele dintre cele mai frecvent utilizate caracteristici pe care nu le-am explorat încă.
Iteratoarele au același scop ca și IEnumerable
și interfețele aferente din .NET, cum ar fi furnizarea unei modalități comune de a naviga prin colecții. Având în vedere a std :: vector
, de exemplu, puteți trece printr-o colecție de elemente utilizând următorul cod:
vectorvec; vec.push_back (1); vec.push_back (4); vec.push_back (7); vec.push_back (12); vec.push_back (8); pentru (auto i = începe (vec); i! = end (vec); i ++) wcout << *i << endl;
std :: începe
funcția oferă un iterator care indică primul element al colecției. std :: end
oferă un iterator care semnalează că am ajuns la sfârșitul unei colecții; ultimul element al colecției, presupunând că colecția are elemente, este un element înaintea elementului dat de noi std :: end
. De aceea verificăm! = În bucla pentru. Dacă nu există elemente în colecție, atunci std :: începe
și std :: end
va reveni la aceeași valoare.
În plus față de iteratorii din cele două funcții ale șabloanelor, multe colecții oferă iteratoare const prin intermediul funcțiilor membrilor numite cbegin și cend, iteratoare inverse (prin intermediul unei colecții înapoi) prin rbegin
și rupe
, și const crbegin
și crend
. În exemplul anterior, puteți înlocui începe (VEC)
cu vec.rbegin ()
și end (VEC)
cu vec.rend ()
pentru a trece prin vector în sens invers.
C ++ 11 a adăugat un tip suplimentar de buclă, numit loop bazat pe interval, care oferă o funcționalitate similară cu bucla foreach din C #. Buclele bazate pe gama folosesc iteratori și vă scutește de problemele de dereferențiere a indicatorilor și de posibilitatea de a verifica în mod necorespunzător sfârșitul. Baza bazată pe interval pentru bucla echivalentă cu buclă for pentru exemplul anterior arată astfel:
pentru (element auto: vec) wcout << item << endl;
std :: vector
și alte containereColecția pe care o veți folosi cel mai mult este std :: vector
. Este o colecție rapidă, cu scop general, similar cu lista
Pentru a adăuga un element la sfârșitul unui vector, utilizați funcția membru împinge înapoi
. Pentru a elimina un element de la sfârșitul unui vector, utilizați pop_back
. Puteți accesa elemente la indexul lor folosind [] în același mod în care ar fi un matrice. Pentru a adăuga un element sau o gamă de elemente la un anumit indice bazat pe zero, utilizați funcția element insert. Pentru a elimina un element sau o gamă de elemente la un anumit index zero, utilizați funcția de ștergere a elementului.
O caracteristică îngustă adăugată în C ++ 11 este funcționalitatea de construcție pe loc asigurată de funcțiile membrilor emplace și emplace_back. În loc să construiți un obiect și apoi să utilizați insert sau push_back pentru al adăuga la vector, puteți să apelați emplace_back și pur și simplu să îi transmiteți aceleași argumente pe care le-ați transmite constructorului pentru tipul pe care vectorul îl deține. Vectorul va construi apoi și adăuga o nouă instanță a obiectului fără calcule suplimentare care vin cu o copie sau o mișcare și fără a utiliza memorie locală suplimentară.
amplaseze
funcția funcționează la fel, cu excepția faptului că începeți prin trecerea acestuia cu un iterator care specifică locația. Poți să folosești cbegin ()
sau cend ()
pentru a adăuga elemente la începutul sau sfârșitul vectorului. Dacă aveți un index specific bazat pe zero pe care doriți să îl utilizați, puteți utiliza vec.cbegin () + idx
. De asemenea, puteți scădea de la cend ()
dacă doriți să plasați un element la un anumit număr de spații de la capăt.
vectorul oferă mai multă funcționalitate, deci ar trebui să o explorați cu certitudine. Funcția membru membru vă va da un element la un index, de exemplu. Există modalități de a spune vectorului să-și redimensioneze capacitatea internă, astfel încât să aveți mai mult spațiu liber - dacă știți că veți avea nevoie exact de 125 de elemente, de exemplu - sau astfel încât să minimalizați utilizarea memoriei - dacă ați adăugat toate elementele de care va avea vreodată nevoie și constrângerile de memorie sunt strânse.
Pe lângă std :: vector
, mai multe containere similare au cazuri de utilizare diferite. std :: vector
ea însăși este cea mai bună alegere atunci când aveți nevoie de acces extrem de rapid și aleator - când veți adăuga mai ales obiecte și eliminați elementele de la sfârșitul colecției. Dacă trebuie, de asemenea, să adăugați elemente frecvent în fața colecției, trebuie să luați în considerare utilizarea std :: deque
in schimb.
Utilizare std :: coadă
pentru un container primul-in, primul-out. Utilizați std :: stack pentru un ultim container, primul container.
std :: harta
clasa oferă un dicționar sortit. std :: unordered_map
oferă o tabelă de tip hash.
std :: set
clasa este o colecție sortată, cu cheie, în care elementul stocat este cheia proprie, astfel încât fiecare element trebuie să fie unic. std :: unordered_set
este echivalentul nesortat std :: set
.
std :: Lista
clasa oferă o listă dublată. std :: forward_list
oferă o singură listă legată.
Antet
Unele funcționalități din Biblioteca C Runtime pot fi utile. În general, cea mai bună modalitate de a accesa biblioteca este să includeți informațiile relevante
Biblioteca standard C ++ are mult mai multe de oferit, așa că recomand să-i explorați și să vă familiarizați cu aceasta. În ultimul articol din această serie, explorăm Visual Studio și modul în care este cel mai bine folosit pentru dezvoltarea C ++.
Această lecție reprezintă un capitol din C ++ Succinctly, o carte electronică gratuită de la echipa de la Syncfusion.