C ++ Kort gezegd C ++ Standard Library

Invoering

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

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:

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


Range-Based voor loops

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 containers

De verzameling die u waarschijnlijk het meest zult gebruiken, is std :: vector. Het is een snelle, universele verzameling die lijkt op Lijst in .NET. Het is te vinden in de header-bestand.

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.

De hoofd

De header bevat veel zeer nuttige functies: dingen zoals zoeken, sorteren, kopiëren en al hun gerelateerde methoden. De beste manier om ze te leren is door ermee te experimenteren.

De C Run-Time Library (CRT)

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 header-bestand, zoals .

Conclusie

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.