Er zijn veel meer dingen in de C ++ Standard Library dan we kunnen bedekken. We beperken ons tot een aantal van de meest gebruikte functies die we nog niet hebben onderzocht.
Iterators dienen hetzelfde doel als IEnumerable
en gerelateerde interfaces in .NET, zoals een manier bieden om door collecties te navigeren. Gegeven a std :: vector
, U kunt bijvoorbeeld de verzameling items doorlopen met behulp van de volgende code:
vectorvec; vec.push_back (1); vec.push_back (4); vec.push_back (7); vec.push_back (12); vec.push_back (8); for (auto i = begin (vec); i! = end (vec); i ++) wcout << *i << endl;
De std :: beginnen
functie geeft een iterator die naar het eerste item in de verzameling wijst. std :: end
geeft een iterator die aangeeft dat we het einde van een verzameling hebben bereikt; het laatste item van de verzameling, ervan uitgaande dat de verzameling items bevat, is één item vóór het item dat we krijgen std :: end
. Dat is de reden waarom we zoeken naar! = In de for-lus. Als er geen items in de verzameling zijn, dan std :: beginnen
en std :: end
zal dezelfde waarde teruggeven.
Naast de iterators van die twee sjabloonfuncties, bieden veel collecties const iterators via lidfuncties cbegin en cend, reverse iterators (die een verzameling naar achteren doorlopen) via rbegin
en scheuren
, en const reverse iterators via crbegin
en crend
. In het vorige voorbeeld kunt u vervangen begin (vec)
met vec.rbegin ()
en uiteinde (vec)
met vec.rend ()
om de vector in omgekeerde volgorde te doorlopen.
C ++ 11 heeft een extra type for-lus toegevoegd, de op reeksen gebaseerde lus genaamd, die dezelfde functionaliteit biedt als de foreach-lus in C #. De op het bereik gebaseerde lus maakt gebruik van iterators en bespaart u de moeite van verwijzingswijzigingen en de mogelijkheid om niet naar het einde te controleren. Het op het bereik gebaseerde lusequivalent aan de for-lus in het vorige voorbeeld ziet er als volgt uit:
for (auto item: vec) wcout << item << endl;
std :: vector
en andere containersDe verzameling die u waarschijnlijk het meest zult gebruiken, is std :: vector
. Het is een snelle, universele verzameling die lijkt op Lijst
Als u een item aan het einde van een vector wilt toevoegen, gebruikt u de ledfunctie terugduwen
. Als u een item van het einde van een vector wilt verwijderen, gebruikt u pop_back
. U kunt items op hun index openen met [] op dezelfde manier als een array. Als u een element of reeks elementen wilt toevoegen aan een specifieke op nul gebaseerde index, gebruikt u de invoeglidfunctie. Als u een element of reeks elementen wilt verwijderen uit een specifieke op nul gebaseerde index, gebruikt u de functie wislid.
Een leuke functie toegevoegd in C ++ 11 is de interne constructie-functionaliteit geboden door de emplace en emplace_back lid functies. In plaats van een object te construeren en vervolgens insert of push_back te gebruiken om het aan de vector toe te voegen, kunt u emplace_back aanroepen en het eenvoudig dezelfde argumenten doorgeven die u zou doorgeven aan de constructor voor het type dat de vector bevat. De vector zal dan een nieuw exemplaar van het object construeren en toevoegen zonder de extra berekeningen die bij een kopie of een verplaatsing horen, en zonder gebruik van extra lokaal geheugen.
De opstellen
functie werkt hetzelfde, behalve dat u begint met het door te geven van een iterator die de locatie aangeeft. Je kunt gebruiken cbegin ()
of CEND ()
om items toe te voegen aan het begin of het einde van de vector. Als u een specifieke op nul gebaseerde index heeft waar u een item naartoe wilt verplaatsen, kunt u gebruiken vec.cbegin () + idx
. Je kunt ook van aftrekken CEND ()
als u een item een aantal spaties wilt plaatsen vanaf het einde.
vector biedt meer functionaliteit, dus je moet het zeker verder verkennen. De at-functie geeft u bijvoorbeeld een item op een index. Er zijn manieren om de vector te laten weten hoe groot de interne capaciteit moet zijn, zodat je meer vrije ruimte hebt - als je bijvoorbeeld precies 125 items zou hebben - of zo het geheugengebruik minimaliseren - als je alle elementen hebt toegevoegd die het ooit nodig zal hebben en geheugenbeperkingen zijn krap.
In aanvulling op std :: vector
, verschillende soortgelijke containers hebben verschillende gebruiksgevallen. std :: vector
zelf is de beste keuze wanneer je extreem snelle, willekeurige toegang nodig hebt - wanneer je meestal items toevoegt aan en items verwijdert vanaf het einde van de verzameling. Als u ook regelmatig items aan de voorkant van de verzameling moet toevoegen, kunt u overwegen om deze te gebruiken std :: Deque
in plaats daarvan.
Gebruik std :: wachtrij
voor een first-in, first-out container. Gebruik std :: stack voor een last-in, first-out container.
De std :: kaart
klasse biedt een gesorteerd woordenboek. std :: unordered_map
biedt een hash-tabel.
De std :: set
Klasse is een gesorteerde, gecodeerde verzameling waarbij het opgeslagen item zijn eigen sleutel is, dus elk element moet uniek zijn. std :: unordered_set
is het ongesorteerde equivalent van std :: set
.
De std :: list
klasse biedt een dubbel gelinkte lijst. std :: forward_list
biedt een afzonderlijk gekoppelde lijst.
hoofdDe
Sommige functies van de C Runtime Library kunnen nuttig zijn. Over het algemeen is de beste manier om toegang te krijgen tot de bibliotheek het relevante
De C ++ Standard Library heeft nog veel meer te bieden, dus ik raad het aan om het te verkennen en er vertrouwd mee te raken. In het laatste artikel van deze serie verkennen we Visual Studio en hoe dit het beste kan worden gebruikt voor C ++ -ontwikkeling.
Deze les staat voor een hoofdstuk uit C ++ Kort gezegd, een gratis eBoek van het team van Syncfusion.