Un iteratore è un puntatore elaborato. Come un puntatore, indica oggetti dello stesso tipo in memoria in momenti diversi. Tutti gli iteratori sono dereferenziabili, ad eccezione dell'iteratore di uscita che è dereferenciabile solo per un insieme di tipi. Dereferenceable significa che il valore indicato dal puntatore o dall'iteratore può essere ottenuto usando l'operatore indirezione, *. Un numero intero può essere aggiunto ad alcuni iteratori allo stesso modo e per lo stesso scopo, l'intero verrebbe aggiunto a un puntatore.
Le domande per questo articolo sono: quali sono questi iteratori? Quali di questi iteratori sono usati con il vettore C ++? Come vengono utilizzati questi iteratori con il vettore C ++? Questo articolo risponde a tutte queste domande in modo semplificato. Alla fine di questo articolo, quando sarebbe stata data risposta a tutte queste domande, gli iteratori vettoriali C ++ saranno intuitivi e naturali (per il lettore).
Contenuto dell'articolo
Riepilogo degli iteratori C ++
Iteratore di ingresso
L'idea di Iteratore input è che un programma riceva valore input. A differenza dell'iteratore di output, l'iteratore di input è sempre dereferenciabile. Per due iteratori di input, A e B, "A == B" non implica "++ A == ++ B".
Iteratore di output
L'idea di output iterator è per un programma per rilasciare il valore di output. A differenza dell'iteratore di input, l'iteratore di output non è sempre dereferenciabile. È dereferenciabile solo per una serie di tipi.
Iteratore in avanti
L'iteratore in avanti può scansionare il vettore dall'inizio alla fine, uno per uno (incremento). Ha tutti i requisiti dell'iteratore di input, oltre a requisiti aggiuntivi. Può sostituire un iteratore di input. Per due iteratori in avanti, A e B, "A == B" implica "++ A == ++ B".
Iteratore bidirezionale
L'iteratore bidirezionale può scansionare il vettore dall'inizio alla fine, uno ad uno. Dalla fine all'inizio, uno per uno (decremento). Ha tutti i requisiti dell'iteratore in avanti, oltre a requisiti aggiuntivi. Può sostituire un iteratore in avanti. Per due iteratori bidirezionali, A e B,
"A == B" implica "++ A == ++ B"
E
"-A == -b" implica "A == B".
Iteratore ad accesso casuale
L'iteratore di accesso casuale ha tutti i requisiti dell'iteratore bidirezionale, oltre a requisiti aggiuntivi. Può sostituire un iteratore bidirezionale. L'iteratore ad accesso casuale ha il vantaggio che se attualmente sta puntando al primo elemento e è richiesto il quarto elemento, salverebbe il secondo e il terzo elementi e indicherebbe il quarto elemento. Il retro che salta verso il basso è vero.
Iteratore inverso
Si noti che C ++ non ha un normale iteratore inverso in quanto ha un iteratore in avanti. Quindi, c'è un adattatore chiamato iteratore inverso. Ci sono altre buone notizie: l'iteratore inverso soddisfa tutti i requisiti di un iteratore bidirezionale.
Iteratore costante
Se si dice che un iteratore sia un cost iteratore, l'elemento in cui punta non può essere modificato.
Costruzione e accesso vettoriali
I contenitori in C ++ sono: Array di classe, Deque, Forward_List, Elenco, Vector, Map, Set, UnOrdered_Map e UnOrdered_Set. Il vettore è un contenitore. Alcuni modelli di funzione nella libreria standard C ++ funzionano con iteratori direttamente o indirettamente. I contenitori C ++, così come il vettore, usano queste funzioni. Queste funzioni possono essere rese disponibili al programma C ++ con una delle seguenti direttive di inclusione:
#includere
O
#includere
L'inclusione di uno qualsiasi degli altri contenitori renderà anche a disposizione questi modelli di funzione. Un modello di funzione è per una funzione che può funzionare con diversi tipi di dati. Il vettore utilizza iteratori attraverso questi modelli di funzione. Alcuni dei modelli di funzione e la loro relazione con il vettore sono i seguenti:
Costruzione
Funzione modello:
modelloContexpr Auto Data (C&C) -> Decltype (C.dati());
auto indica che il tipo di ritorno è determinato alla valutazione della funzione. C è l'oggetto della classe C.
Un esempio di oggetto vettoriale costruito con questo è implicitamente:
vettoreVTR;
Qui l'oggetto, c, è vuoto.
Funzione modello:
modelloDati di constExpr const e* (inizializer_list IL) NOExcept;
Qui, E* è un iteratore che indica il primo elemento dell'elenco o del contenitore. Il suo uso con il vettore implicitamente sarebbe con:
vettorevtr 'a', 'b', 'c', 'd', 'e';
vettore:: const_iterator it = vtr.inizio();
La funzione modello è più applicabile all'istruzione iniziale () (la seconda istruzione).
Accesso
Funzione modello:
modelloDimensione automatica costexpr (const C&C) -> Decltype (C.misurare());
Questo restituisce le dimensioni del contenitore. Esempio vettoriale:
vettorevtr 'a', 'b', 'c', 'd', 'e';
int n = vtr.misurare();
cout << N << endl;
L'output è 5.
Funzione modello:
modello[[nodiscard]] costexpr bool vuoto (inizializer_list IL) NOExcept;
Restituisce vero se l'elenco è vuoto o falso altrimenti. Esempio vettoriale:
vettorevtr 'a', 'b', 'c', 'd', 'e';
bool bl = vtr.vuoto();
cout << bl << endl;
L'output è 0 per false.
Accesso a portata
Esistono altre funzioni di modello, che utilizzano iteratori che il vettore utilizza per i suoi problemi di gamma. Un intervallo è un set consecutivo di elementi container.
Funzione modello:
modellocostexpr Auto Begin (C&C) -> Decltype (C.inizio());
Questo restituisce un iteratore che punta al primo elemento nell'elenco. auto qui significa che il valore di ritorno è determinato durante la valutazione. Esempio per vettoriale:
vettorevtr 'a', 'b', 'c', 'd', 'e';
vettore:: iterator it = vtr.inizio();
cout << *it << '\n';
L'output è un. L'iteratore restituito qui è un iteratore ad accesso casuale. Un iteratore di accesso casuale costante avrebbe potuto essere restituito - vedi più tardi.
Modello di funzione:
modellocostexpr Auto End (const C&C) -> Decltype (C.FINE());
Restituisce un iteratore costante che punta all'ultimo elemento dell'elenco. Codice vettoriale:
vettorevtr 'a', 'b', 'c', 'd', 'e';
vettore:: const_iterator it = vtr.FINE();
--Esso;
cout << *it << ";
--Esso;
cout << *it << endl;
L'output è "e d". Un iteratore costante può essere incrementato o decrementato, ma il valore a cui indica non può essere modificato. Un normale iteratore di accesso casuale avrebbe potuto essere restituito - vedi più avanti.
Modello di funzione:
modellocostexpr revers_iterator rbegin (inizializer_list I l);
Restituisce l'ultimo valore nell'elenco. rbegin () indica l'ultimo elemento dell'elenco e non oltre l'ultimo elemento dell'elenco, come end (). Esempio vettoriale:
vettorevtr 'a', 'b', 'c', 'd', 'e';
vettore:: inverse_iterator IT = VTR.rbegin ();
cout << *it << ";
++Esso;
cout << *it << endl;
L'output è: e d. Con l'iteratore inverso, ++ ha l'effetto opposto per l'iteratore bidirezionale.
Modello di funzione:
modellocostexpr revers_iterator Rend (inizializer_list I l);
Punti appena prima del primo elemento dell'elenco. Esempio vettoriale:
vettorevtr 'a', 'b', 'c', 'd', 'e';
vettore:: inverse_iterator IT = VTR.rend ();
--Esso;
cout << *it << ";
--Esso;
cout << *it << endl;
L'output è una b. Con l'iteratore inverso, - ha l'effetto opposto per ++ dell'iteratore bidirezionale.
Esistono altre funzioni di modello sotto questa intestazione - vedi più avanti.
Inserire iteratori
reverse_iterator è un adattatore iteratore, non in realtà un iteratore. L'iteratore di inserimento è anche un adattatore iteratore. Soddisfa tutti i requisiti dell'iteratore di output, oltre ai propri requisiti. Esiste in tre forme in C ++: il back_inserter, il front_inserter e l'inserter. Ognuno di questi ha il suo costruttore.
back_inserter:
Inserti sul retro!
Prototipi importanti:
esplicito back_insert_iterator (contenitore & x);
back_insert_iterator & operator = (Tylename Container :: value_type && value);
Esempio vettoriale:
Il vettore non ha alcuna funzione del membro di inserimento che inserisce sul retro. Tuttavia, la funzione membro push_back (t) può essere vista così.
front_inserter
Inserti nella parte anteriore!
Prototipi importanti:
esplicito front_insert_iterator (contenitore & x);
front_insert_iterator & operator = (Tylename Container :: value_type && value);
Esempio vettoriale:
Il vettore non ha alcuna funzione del membro di inserimento che inserisce nella parte anteriore. Il vettore non ha anche la funzione membro push_front (t).
La buona notizia è che il vettore ha le funzioni dei membri che possono inserire ovunque, all'inizio, all'interno o alla fine del vettore.
Inserter
Questo iteratore si inserisce all'inizio, all'interno o alla fine del vettore.
Prototipi importanti:
insert_iterator (contenitore e x, container da tipografia :: iteratore i);
Insert_iterator & Operator = (TyleName Container :: value_type && value);
Esempio vettoriale:
vettorevtr 'a', 'b', 'c', 'd', 'e';
vettore:: iterator it = vtr.inizio();
It = It + 2;
VTR.inserire (esso, 'c');
per (int i = 0; icout << vtr[i] << ", ";
cout <L'output è:
A, B, C, C, D, E,L'espressione del vettoriale è:
VTR.inserire (esso, 'c');Inserisce l'elemento appena prima del puntatore (esso) a cui indica.
Sposta iteratore
Il Move_iterator è anche un adattatore iteratore. Il seguente programma è simile all'esempio che si trova nella specifica C ++:
#includere
#includere
#includere
Utilizzo dello spazio dei nomi std;
int main ()
elencochs 'a', 'b', 'c', 'd', 'e';
vettoreVTR (make_move_iterator (CHS.inizio ()), make_move_iterator (CHS.FINE()));
cout << "Original list Content:" << endl;
per (auto It = CHS.inizio(); Esso != CHS.FINE(); It ++)
cout << *it << ", ";
cout << endl << endl;
cout << "Vector Content:" << endl;
per (int i = 0; icout << vtr[i] << ", ";
cout << endl;
restituzione 0;L'output è:
Contenuto dell'elenco originale:
A, B, C, D, E,Contenuto vettoriale:
A, B, C, D, E,Questo iteratore converte un valore di origine in un RValue prima di posizionarlo a destinazione.
Conclusione
I principali iteratori in C ++ sono iteratori di input, iteratore di uscita, iteratore in avanti, iteratore bidirezionale e iteratore ad accesso casuale. La libreria standard C ++ ha alcuni modelli di funzioni che utilizzano questi iteratori. Il vettore utilizza questi iteratori attraverso i modelli di funzione. Il vettore ha alcuni nomi diversi per alcuni di questi iteratori. Ci sono anche adattatori iterator, che sono: reverse_iterator, adattatore iteratore e move_iterator. Esistono anche alcune varianti di iteratori. È sufficiente includere in un programma avere tutte queste funzionalità. Dopo aver compreso il ruolo di questi iteratori, adattatori e modelli di funzione che li usano, usando iteratori con vettori diventano intuitivi.