C ++ Succinct Biblioteca standard C ++

Introducere

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ă.

iteratori

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:

 vector vec; 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.


Gama bazată pe bucle

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 containere

Colecția pe care o veți folosi cel mai mult este std :: vector. Este o colecție rapidă, cu scop general, similar cu lista în .NET. Se găsește în fișierul antet.

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

antetul conține multe funcții foarte utile: lucruri cum ar fi găsirea, sortarea, copierea și toate metodele aferente. Cea mai bună modalitate de a le învăța este să le experimentați.

Biblioteca C Run-Time (CRT)

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 fișierul antet, cum ar fi .

Concluzie

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.
Cod