Iteratori
Le funzionalità della libreria STL fare un utilizzo esteso degli iteratori mediare tra diversi algoritmi e sequenze su cui agiscono. Il nome di un tipo di iteratore (o del prefisso) indica la categoria degli iteratori necessari per il tipo. Per la potenza, le categorie sono riepilogate qui come:
Output. Un iteratore X di output può includere un riferimento archiviato V di valore, dopo il quale deve essere incrementato prima dell'archivio seguente, ad esempio in (*X++ = V), (*X = V,X++), o (*X = V, X++).
Input. Un iteratore X di input può rappresentare un singolo valore che indica la fine della sequenza. Se un iteratore di input non e il valore di fine di sequenza, può disporre di un accesso indiretto V di valore in qualsiasi numero di volte, ad esempio inV = (*X). Per diventare il valore o alla fine successivo nella sequenza, viene incrementato, come in c++X, X++ o,V = *X++). Una volta che incrementato una copia di un iteratore di input, nessuna delle altre copie possono in modo sicuro essere confrontate, dereferenziate, o essere incrementato successivamente.
In avanti. Un iteratore avanti X può sostituire un iteratore di output per la scrittura o un iteratore di input per leggere. È possibile, tuttavia, read (con V =) *Xquanto è stato scritto solo tramite *X = V) con un iteratore avanti. È inoltre possibile eseguire più copie di un iteratore avanti, ognuno dei quali può dereferenziare indipendente e incrementato.
Bidirezionale. Un iteratore bidirezionale X può sostituire un iteratore avanti. È possibile, tuttavia, anche decrementare un iteratore bidirezionale, ad esempio in --X, X--o,V = *X--).
Accesso casuale. Un iteratore di accesso casuale X può sostituire un iteratore bidirezionale. È inoltre possibile eseguire più o meno lo stesso l'aritmetica Integer in un iteratore di accesso casuale che è possibile in un puntatore a un oggetto. Per N, un oggetto Integer, è possibile scrivere xN[], x + N, x - N e N + X.
Si noti che un puntatore a un oggetto può sostituire un iteratore di accesso casuale o qualsiasi altro iteratore. Tutti gli iteratori è possibile assegnare o copiati. Siano oggetti lightweight e spesso vengono passati e restituiti per valore, non per riferimento. Si noti inoltre che nessuna delle operazioni descritte in precedenza possano generare un'eccezione una volta eseguite su un iteratore valido.
La gerarchia delle categorie di iteratore può essere riepilogata mostrando tre sequenze. Per l'accesso di sola scrittura a una sequenza, è possibile utilizzare qualsiasi opzione riportata di seguito:
output iterator
-> forward iterator
-> bidirectional iterator
-> random-access iterator
I mezzi freccia destra "possono essere sostituiti da." Qualsiasi algoritmo che richiede un iteratore di output deve essere piacevolmente con un iteratore avanti, ad esempio, ma non a viceversa.
Per l'accesso in sola lettura a una sequenza, è possibile utilizzare qualsiasi opzione riportata di seguito:
input iterator
-> forward iterator
-> bidirectional iterator
-> random-access iterator
Un iteratore di input è il più debole di tutte le categorie, in questo caso.
Infine, per l'accesso in lettura/scrittura a una sequenza, è possibile utilizzare qualsiasi opzione riportata di seguito:
forward iterator
-> bidirectional iterator
-> random-access iterator
Un puntatore a un oggetto può fornire sempre dagli iteratori di accesso casuale, pertanto può fungere da ogni categoria di iteratore se supporta l'accesso in lettura/scrittura appropriato sequenza che definisce.
Un iteratore Iterator diverso da un puntatore a un oggetto deve inoltre possibile definire i tipi di membri richiesti dalla specializzazione iterator_traits<Iterator>. Si noti che le pretese possono essere presente Iterator derivazione dalla classe base pubblica iteratore.
Questa "algebra" degli iteratori è fondamentale per praticamente qualsiasi altra attività nella libreria di modelli standard. È importante comprendere le promesse e le limitazioni di ogni categoria di iteratore vedere come gli iteratori vengono utilizzati dai contenitori e gli algoritmi in STL.
Nota
È inoltre possibile utilizzare per ognuna di esse, in per scorrere le raccolte STL.Per ulteriori informazioni, vedere Procedura: Scorrere la libreria STL con per ciascuno.
Visual C++ ora offre gli iteratori verificati e gli iteratori di debug per assicurarsi di non sovrascrivere i limiti del contenitore. Per ulteriori informazioni, vedere Iteratori verificati e Supporto degli iteratori di debug.