C ++ Succinctly C ++ Standardbibliotek

Introduksjon

Det er langt flere ting i C ++ Standard Library enn vi har tid til å dekke. Vi vil begrense oss til å se på noen av de mest brukte funksjonene som vi ennå ikke har utforsket.

iteratorer

Iteratorer tjener samme formål som IEnumerable og tilhørende grensesnitt i .NET, for eksempel å gi en felles måte å navigere gjennom samlinger. Gitt a std :: vektor, for eksempel kan du løse gjennom samlingen av gjenstander ved hjelp av følgende kode:

 vektor vec; vec.push_back (1); vec.push_back (4); vec.push_back (7); vec.push_back (12); vec.push_back (8); for (auto i = start (vec); i! = ende (vec); i ++) wcout << *i << endl; 

De std :: begynne funksjonen gir en iterator som peker på det første elementet i samlingen. std :: slutten gir en iterator som signaliserer at vi har nådd slutten av en samling; Det siste elementet i samlingen, forutsatt at samlingen har noen elementer, er ett element før varen vi får av std :: slutten. Det er derfor vi sjekker for! = I forløp. Hvis det ikke er noen elementer i samlingen, så std :: begynne og std :: slutten vil returnere samme verdi.

I tillegg til iteratorene fra disse to malfunksjonene, gir mange samlinger konstatører via medlemsfunksjoner kalt cbegin og cend, revers iteratorer (som løper gjennom en samling bakover) via rbegin og rend, og const reverse iteratorer via crbegin og crend. I det forrige eksempelet kan du erstatte begynne (vec) med vec.rbegin () og ende (vec) med vec.rend () å gå gjennom vektoren i revers.


Range-Based for Loops

C + + 11 har lagt til en ekstra type for loop, kalt range-basert for loop, som gir funksjonalitet som ligner på forløpsløkken i C #. Utvidelsesbasert for sløyfe bruker iteratorer og sparer deg for problemer med de-referencing pointers og muligheten for feilkontroll for slutten. Den rekkevidde basert på sløyfe som er ekvivalent med for-sløyfen i det forrige eksempelet ser slik ut:

 for (auto element: vec) wcout << item << endl; 

std :: vektor og andre containere

Samlingen du sannsynligvis vil bruke mest er std :: vektor. Det er en rask, generell samling som ligner på Liste i .NET. Det finnes i header fil.

For å legge til et element i enden av en vektor, bruk medlemsfunksjonen push_back. For å fjerne et element fra enden av en vektor, bruk pop_back. Du kan få tilgang til elementer på deres indeks ved hjelp av [] på samme måte som du ville ha en matrise. For å legge til et element eller et utvalg av elementer på en bestemt nullbasert indeks, bruk innsatsmedlemsfunksjonen. Hvis du vil fjerne et element eller et utvalg av elementer på en bestemt nullbasert indeks, bruker du sletteelementfunksjonen.

En nydelig funksjon lagt til i C + + 11 er den innebygde konstruksjonsfunksjonaliteten som tilbys av emplace og emplace_back-medlemsfunksjonene. I stedet for å bygge en gjenstand og deretter bruke innsats eller push_back for å legge den til vektoren, kan du ringe emplace_back og bare sende den samme argumentene du ville overføre til konstruktøren for typen som vektoren holder. Vektoren vil da konstruere og legge til en ny forekomst av objektet uten de ekstra beregningene som følger med en kopi eller et trekk, og uten å bruke ekstra lokalt minne.

De emplace funksjonen fungerer det samme, bortsett fra at du begynner med å sende den en iterator som spesifiserer stedet. Du kan bruke cbegin () eller cend () å legge til elementer i begynnelsen eller slutten av vektoren. Hvis du har en spesifikk nullbasert indeks du vil plassere et element på, kan du bruke vec.cbegin () + idx. Du kan også trekke fra cend () hvis du vil plassere et element noen antall mellomrom fra slutten.

vektoren gir mer funksjonalitet, så du bør definitivt utforske den videre. Funksjonen på medlemmet vil gi deg et element på en indeks, for eksempel. Det er måter å fortelle vektoren om å endre størrelsen på den interne kapasiteten, slik at du har mer plass gratis - hvis du visste at du trenger nøyaktig 125 elementer, for eksempel - eller så minimerer du minnebruk - hvis du har lagt til alle elementene som det noen gang vil trenge og minnesbegrensninger er stramme.

I tillegg til std :: vektor, flere lignende beholdere har forskjellige brukstilfeller. std :: vektor seg selv er det beste valget når du trenger ekstremt rask, tilfeldig tilgang - når du for det meste vil legge til elementer til og fjerne elementer fra hele slutten av samlingen. Hvis du også trenger å legge til elementer ofte på forsiden av samlingen, bør du vurdere å bruke std :: deque i stedet.

Bruk std :: kø for en første-i, først-ut-container. Bruk std :: Stack for en last-in, first-out container.

De std :: kart klassen gir en ordnet ordbok. std :: unordered_map gir et hashbord.

De std :: satt klassen er en sortert, nøkkelinnsamling der varen er lagret, er en egen nøkkel, så hvert element må være unikt. std :: unordered_set er usortert ekvivalent av std :: satt.

De std :: liste klassen gir en dobbeltkoblet liste. std :: forward_list gir en enkeltlinket liste.

De Overskrift

De header inneholder mange svært nyttige funksjoner: ting som å finne, sortere, kopiere og alle relaterte metoder. Den beste måten å lære dem på er å eksperimentere med dem.

C Run-Time Library (CRT)

Enkelte funksjoner fra C Runtime Library kan være nyttige. Generelt er den beste måten å få tilgang til biblioteket, å inkludere det aktuelle header-fil, for eksempel .

Konklusjon

C ++ Standard Library har mye mer å tilby, så jeg anbefaler å utforske det og bli kjent med det. I den endelige artikkelen i denne serien undersøker vi Visual Studio og hvordan det er best brukt for C ++-utvikling.

Denne leksjonen representerer et kapittel fra C ++ Succinctly, en gratis eBok fra teamet på Syncfusion.