Una iterador a C ++ és un objecte semblant a un punter que apunta a un element del contenidor STL. Generalment s’utilitzen per bucle del contingut del contenidor STL en C ++. El principal avantatge dels iteradors STL és que fan que els algoritmes STL siguin independents del tipus de contenidor utilitzat. Només podem passar l’iTerador als elements del contenidor en lloc del contenidor en si als algoritmes STL.
Declaració iteradora
Cada contenidor de C ++ STL té el seu propi iterador. Per tant, hem de declarar un iterador com:
C++
<type>::iterator it;
on
- Tipus: Tipus de contenidor per al qual es declara el iterador.
- It: Nom assignat a l'objecte iterator.
A continuació, podem inicialitzar -lo assignant algun iterador vàlid. Si ja tenim un iterador per ser assignat en el moment de Delcaration, podem saltar la declaració del tipus mitjançant la automàtic Paraula clau.
C++auto it = iter
on iter L’iterador s’assigna a l’iTerator de la nova creació.
Nostre Curs C ++ Cobreix l’ús d’iterators a la STL que us permetrà comprendre com travessar diferents tipus de contenidors.
Exemple d’iterators
El programa següent il·lustra com utilitzar el iterador per recórrer el contenidor vectorial:
C++#include using namespace std; int main() { vector<int> v = {1 2 3 4 5}; // Defining an iterator pointing to // the beginning of the vector vector<int>::iterator first = v.begin(); // Defining an iterator pointing // to the end of the vector vector<int>::iterator last = v.end(); // Iterating the whole vector while(first != last) { cout << *first << ' '; first++; } return 0; }
Producció
1 2 3 4 5
Com heu pogut notar que hem utilitzat Vector :: begin () i vector :: end () funció. Aquestes funcions són les funcions membres de std :: vector que retorna el iterador al primer i un element després de l'últim element del vector. Utilitzem el retorn dels iteradors ser aquestes funcions per iterar els vectors.
Funcions de iterador de contenidors
C ++ STL proporciona algunes funcions de membre a Contenidor STL que retornen els iteradors a almenys el primer i el darrer element. Aquestes funcions membres es defineixen en gairebé tot el contenidor STL (deixant alguns contenidors d'accés limitat apilar fer cua ) amb el mateix nom per a la coherència.
La taula següent mostra tots els mètodes que retorna el iterador als contenidors:
Funció iteradora | Valor de retorn |
|---|---|
començar () | Retorna un iterador al començament del contenidor. |
End () | Retorna un iterador a l'element teòric just després de l'últim element del contenidor. |
cbegin () | Retorna un iterador constant al començament del contenidor. Un iterador constant no pot modificar el valor de l'element al qual apunta. |
uns quants () edat de vicky kaushal | Retorna un iterador constant a l'element teòric just després de l'últim element del contenidor. |
rbegin () | Retorna un iterador invers al començament del contenidor. |
render () | Retorna un iterador invers a l'element teòric just després de l'últim element del contenidor. |
crbegin () | Retorna un iterador inversa constant al començament del contenidor. |
Crend () | Retorna un iterador inversa constant a l'element teòric just després de l'últim element del contenidor. |
Per exemple si una cosa és el nom del vector, llavors podem utilitzar els mètodes anteriors tal com es mostra a continuació:
C++vec.begin() vec.rbegin() vec.cbegin() vec.crbegin() vec.end() vec.rend() vec.cend() vec.crend()
Operacions en iterators
Igual que l’aritmètica del punter, hi ha algunes operacions que es permeten als iteradors de C ++. S’utilitzen per proporcionar diferents funcionalitats que augmentin la importància dels iteradors. Hi ha 5 vàlids Operacions iteradores a C ++ :
- Dereferencing Iterators
- Itterators incrementats/decreixents
- Afegint/restant enter als iteradors
- Restant un altre iterador
- Comparant iteradors
Dereferencing Iterators
L'operació de transferència permet als usuaris Accés o actualització El valor de l’element apuntat per l’iterador. Utilitzem el (*) operador d'indirecció per desfer els iterators igual que els indicadors.
C++// Access *it; // Update *it = new_val;
on new_val és el nou valor assignat a l'element apuntat per iterator la .
Itterators incrementats/decreixents
Podem incrementar o disminuir el iterador per 1 mitjançant (++) o (-) operadors respectivament. L’operació d’increment mou l’iTerator a l’element següent del contenidor mentre l’operació de declinació mou l’iTerator a l’element anterior.
C++it++; // post-increment ++it; // pre-increment it--; // post-decrement --it; // pre-decrement
Afegint/restant enter als iteradors
També podem afegir o restar un valor enter dels iteradors. Es farà més el iterator la següent o la posició anterior segons el valor enter afegit.
C++// Addition it + int_val; // Subtraction it - int_val;
on int_val són els valors enters que s’afegeixen o es resten del iterator la .
Restant un altre iterador
Podem restar un iterador d’un altre per trobar la distància (o el nombre d’elements) entre la memòria que apunten.
C++it1 - it2
Comparant iteradors
També podem provar els dos iteradors del mateix tipus els uns contra els altres per trobar la relació entre ells. Podem utilitzar els operadors relacionals com (==) Igualtat i (! =) Operadors de desigualtat juntament amb altres operadors relacionals com ara< > <= >=.
C++it1 != it2 // Equal to it1 == it2 // Not equal to it1 > it2 // Greater than it1 < it2 // Less than it1 >= it2 // Greater than equal to it1 <= it2 // Less than equal to
Tipus d'iTerators a C ++
Els iteradors STL es poden dividir a partir de les operacions que es poden realitzar. Hi ha 5 tipus principals d'iTerators a C ++ que es mostren a la taula següent juntament amb contenidors compatibles i operacions iteradores suportades.
Iterador | Descripció | Contenidors compatibles | Operacions suportades |
|---|---|---|---|
Iterador d'entrada | És un iterador unidireccional que s'utilitza per llegir els valors. | Flux d'entrada | Dereferencing Igualtat de l'increment |
Iterador de sortida | També és un iterador unidireccional, però s'utilitza per assignar els valors. No pot accedir als valors. | Flux de sortida | Increment de derivació (només escriu) |
Endavant iterators | Pot accedir i també assignar els valors. És la combinació de iterador d’entrada i de sortida. | reenviament_list no ordenat_map Unordered_set | Dereferencing Igualtat de l'increment |
Iterators bidireccionals | Es pot moure en la direcció tant en endavant com en endarreriment. Els contenidors com el conjunt de llistes i el multimap admet iteradors bidireccionals. | Llista de mapes MultiMAP Multiset | Igualtat d’increment/declivació d’increment |
Iterators d'accés aleatori | Els iteradors d'accés aleatori són iteradors que es poden utilitzar per accedir a elements a distància des de l'element que apunten a oferir la mateixa funcionalitat que els punters. | Cadena de matriu de vector de la matriu farciment css | Totes |
Com potser hem notat a la taula anterior, a part dels iteradors d’entrada i sortida A mesura que baixem per la taula, el tipus iterador conté les funcions de iterador anterior juntament amb algunes funcions noves.
Adaptadors iteradors
Els adaptadors iteradors a C ++ són el tipus especial d’iTerators que es construeixen sobre iteradors tradicionals per proporcionar una funcionalitat especialitzada. Hi ha molts adaptadors iteradors a C ++ alguns dels quals es mostren a continuació:
Adaptadors iterator Tipus | Descripció |
|---|---|
Iterador invers | El iterador invers es construeix sobre tipus bidireccional o per sobre del tipus d’operador i permet als usuaris recórrer el contenidor en sentit invers. |
Transmeten iteradors | Els iteradors del flux, és a dir, Istream i Ostream Iterators es basen en els iteradors d’entrada i sortida respectivament. Aquests iteradors permeten als usuaris utilitzar els fluxos com a contenidors. |
Moure els iteradors | Els iteradors de moviment s’utilitzen per introduir la semàntica de moviment en algoritmes STL. El moviment iterator trasllada la propietat de les dades del contenidor copiat al contenidor de còpia sense crear còpies addicionals. |
Iterador inserter | Els iteradors insertors permeten inserir els elements donats en alguna posició del contenidor. Hi ha tres iteradors inserts a C ++:
Aquests iteradors es poden crear mitjançant back_inserter () fronter_inserter () inserir () Funcions en C ++. |
Funcions d’utilitat iterator a C ++
C ++ STL proporciona la funció diverses per simplificar el treball amb iterators. Es mostren a la taula següent:
| Funcionar | Descripció | Sintaxi |
|---|---|---|
| std :: avanç | Avança un iterador per un nombre específic de posicions. | avanç ( n Que) |
| std :: Següent | Retorna el iterador que és un nombre especificat de posicions per davant del iterador donat. | pròxim ( n Que) |
| Std :: previ | Retorna el iterador que és un nombre especificat de posicions darrere del iterador donat. | previ ( n Que) |
| Std :: Distància | Retorna el nombre d’elements entre dos iteradors. | distància ( it1 it2 Que) |
| std :: comença | Retorna un iterador al primer element del contenidor donat. | començar ( contenidor Que) |
| std :: final | Retorna un iterador a l'element després de l'últim element del contenidor donat. | final ( contenidor Que) |
| std :: rbegin | Retorna un iterador invers a l'últim element del contenidor donat. | rbegin ( contenidor Que) |
| std :: Rend | Retorna un iterador invers a l'element anterior al primer element del contenidor donat. | fer ( contenidor Que) |
| std :: Inserter | Crea un iterador d’inserció que insereix elements en un contenidor en una posició especificada. | inserter ( posició del contenidor Que) |
| std :: back_inserter | Crea un iterador d'inserció posterior que afegeix elements fins al final d'un contenidor. | back_inserter ( contenidor Que) |
| std :: fronter_inserter | Crea un iterador d’inserció frontal que insereix elements a la part frontal d’un contenidor. | Front_inserter ( contenidor Que) |
Aplicacions d'iterators amb exemples
Els iteradors s’utilitzen àmpliament en C ++ per a molts propòsits diferents mentre treballen amb contenidors i algoritmes STL. A continuació, es mostren algunes aplicacions principals dels iteradors a C ++ que els seus exemples de codi:
Travessing Containers
Traversing Containers STL és l’aplicació més bàsica dels iteradors. En això utilitzem les funcions Begin () i End () per aconseguir que els iteradors Begin i End passin a recórrer tot el contenidor. Bàsicament continuem incrementant el iterador de començament fins que no sigui igual al final.
Exemple
C++#include using namespace std; int main() { set<int> s = {10 20 30 40 50}; // Iterator to the beginning // of the set auto it = s.begin(); // Iterating through the // entire set while (it != s.end()) { // Dereferencing iterator // to access value cout << *it << ' '; // Incrementing the // iterator it++; } return 0; }
Producció
10 20 30 40 50
Com es mostra al codi anterior, travessem el contenidor de conjunt. De la mateixa manera, podem utilitzar el mateix enfocament per recórrer qualsevol contenidor.
Invertint un contenidor
Els iteradors inversos permeten recórrer un contenidor des del final fins al principi sense necessitat de manejar manualment la reversió.
Exemple
C++#include using namespace std; int main() { vector<int> vec = {10 20 30 40 50}; // Defining reverse iterators // pointing to the reverse // beginning of vec auto it = vec.rbegin(); // Iterating the whole // vector in reverse while (it != vec.rend()) { cout << *it << ' '; it++; } return 0; }
Producció
50 40 30 20 10
Algoritmes independents del contenidor
Els iteradors permeten que els algoritmes funcionin amb qualsevol tipus de contenidor que faci funcions com std :: sort () std :: trobar () i std :: for_each () més flexible. Podeu passar iterators en lloc del contenidor real.
Exemple
C++#include using namespace std; int main() { vector<int> vec = {30 10 40 10 50}; multiset<int> ms = {10 30 10 20 40 10}; // Using the std::count() algorithm to count // the number of occurences of 10 in vector // and multiset using iterator cout << '10s in Vector: ' << count(vec.begin() vec.end() 10) << endl; cout << '10s in Multiset: ' << count(ms.begin() ms.end() 10); return 0; }
Producció
10s in Vector: 2 10s in Multiset: 3
Aplicacions addicionals d’iTerators
Hi ha més aplicacions de iteradors STL:
- Càlcul de distància: Utilitzant iteradors STD :: DISTANT () ajuden a calcular el nombre d’elements entre dues posicions d’un contenidor.
- Itteració de flux: Els iteradors de flux us permeten tractar els fluxos d’entrada/sortida com els contenidors que faciliten la lectura i escriuen a fluxos mitjançant algoritmes STL.
- Mou la semàntica en algoritmes STL: Els iteradors de moviment introdueixen la semàntica de moviment en algoritmes STL que ajuda a augmentar el rendiment i l'eficiència evitant una còpia innecessària. Les dades es traslladaran segons les regles de la semàntica de moviment.
- Iterators personalitzats per a estructures de dades: Els iteradors personalitzats es poden implementar per a estructures de dades que no siguin STL com arbres o gràfics per proporcionar el suport a algoritmes STL i moltes altres funcions. És possible que haguem de seguir algunes regles i convencions per proporcionar una disminució incremental i altres operacions.