Ci sono molte più cose nella Libreria Standard C ++ di quante ne abbiamo il tempo di coprire. Ci limiteremo a guardare alcune delle funzionalità più comunemente utilizzate che non abbiamo ancora esplorato.
Gli iteratori hanno lo stesso scopo di IEnumerable
e interfacce correlate in .NET, come fornire un modo comune per navigare attraverso le collezioni. Dato a std :: vector
, ad esempio, puoi scorrere la sua collezione di oggetti usando il seguente codice:
vettorevec; 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;
Il std :: iniziare
funzione fornisce un iteratore che punta al primo elemento della raccolta. std :: end
fornisce un iteratore che segnala che abbiamo raggiunto la fine di una raccolta; l'ultimo oggetto della collezione, supponendo che la raccolta abbia oggetti, è un oggetto prima dell'oggetto che ci viene dato std :: end
. Ecco perché controlliamo! = Nel ciclo for. Se non ci sono elementi nella collezione, allora std :: iniziare
e std :: end
restituirà lo stesso valore.
Oltre agli iteratori di queste due funzioni del modello, molte raccolte forniscono costitutori tramite funzioni membro denominate cbegin e cend, iteratori inversi (che eseguono il ciclo attraverso una raccolta all'indietro) tramite rbegin
e lacerare
, e const iteratori inversi via crbegin
e crend
. Nell'esempio precedente, puoi sostituire begin (vec)
con vec.rbegin ()
e end (vec)
con vec.rend ()
per passare attraverso il vettore al contrario.
C ++ 11 ha aggiunto un tipo aggiuntivo di ciclo for, chiamato loop for-based, che fornisce funzionalità simili al ciclo foreach in C #. Il ciclo basato su intervallo utilizza gli iteratori e ti risparmia la fatica di de-referenziare i puntatori e la possibilità di controllare erroneamente la fine. Il loop per loop equivalente al ciclo for nell'esempio precedente ha il seguente aspetto:
per (articolo automatico: vec) wcout << item << endl;
std :: vector
e altri contenitoriLa collezione che probabilmente userai di più è std :: vector
. È una raccolta veloce e generica simile alla Lista
Per aggiungere un elemento alla fine di un vettore, utilizzare la funzione membro respingere
. Per rimuovere un oggetto dalla fine di un vettore, utilizzare pop_back
. Puoi accedere agli elementi nel loro indice usando [] nello stesso modo in cui faresti un array. Per aggiungere un elemento o un intervallo di elementi a uno specifico indice a base zero, utilizzare la funzione membro di inserimento. Per rimuovere un elemento o un intervallo di elementi in uno specifico indice a base zero, utilizzare la funzione membro di cancellazione.
Un'ottima funzionalità aggiunta in C ++ 11 è la funzionalità di costruzione sul posto fornita dalle funzioni emplace ed emplace_back. Piuttosto che costruire un oggetto e quindi usare insert o push_back per aggiungerlo al vettore, è possibile chiamare emplace_back e semplicemente passarlo agli stessi argomenti che si sarebbero passati al costruttore per il tipo che il vettore è in possesso. Il vettore quindi costruirà e aggiungerà una nuova istanza dell'oggetto senza i calcoli extra forniti con una copia o una mossa e senza utilizzare memoria locale aggiuntiva.
Il colloco
la funzione funziona allo stesso modo, tranne che si inizia passando un iteratore che specifica la posizione. Puoi usare CBEGIN ()
o CEND ()
per aggiungere elementi all'inizio o alla fine del vettore. Se si dispone di un indice a base zero specifico a cui si desidera collocare un elemento, è possibile utilizzare vec.cbegin () + idx
. Puoi anche sottrarre da CEND ()
se vuoi mettere un oggetto un certo numero di spazi dalla fine.
il vettore offre più funzionalità, quindi dovresti assolutamente esplorarlo ulteriormente. Ad esempio, la funzione membro at ti darà un elemento in un indice. Ci sono modi per dire al vettore di ridimensionare la sua capacità interna in modo da avere più spazio libero, se sapessi che occorrerebbero esattamente 125 elementi, per esempio, o minimizzi l'utilizzo della memoria, se hai aggiunto tutti gli elementi di cui avrà bisogno e i vincoli di memoria sono stretti.
Inoltre std :: vector
, diversi contenitori simili hanno diversi casi d'uso. std :: vector
è di per sé la scelta migliore quando hai bisogno di un accesso casuale estremamente veloce, quando per lo più aggiungi elementi e rimuovi oggetti dalla fine della raccolta. Se hai anche bisogno di aggiungere elementi di frequente nella parte anteriore della raccolta, dovresti prendere in considerazione l'utilizzo std :: deque
anziché.
Uso std :: coda
per un contenitore first-in, first-out. Usa std :: stack per un contenitore last-in, first-out.
Il std :: map
la classe fornisce un dizionario ordinato. std :: unordered_map
fornisce una tabella hash.
Il std :: set
class è una raccolta ordinata e con chiave in cui l'elemento memorizzato è la propria chiave, quindi ogni elemento deve essere univoco. std :: unordered_set
è l'equivalente non assortito di std :: set
.
Il std :: list
la classe fornisce una lista doppiamente collegata. std :: forward_list
fornisce una lista concatenata.
IntestazioneIl
Alcune funzionalità della libreria di runtime C possono essere utili. In generale, il modo migliore per accedere alla libreria è includere il relativo
La libreria standard C ++ ha molto di più da offrire quindi consiglio vivamente di esplorarla e familiarizzarmi con essa. Nell'articolo finale di questa serie, esploriamo Visual Studio e come è meglio utilizzato per lo sviluppo in C ++.
Questa lezione rappresenta un capitolo di C ++, un eBook gratuito del team di Syncfusion.