logo

Iterators a C ++ STL

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 ++:

  1. back_insert_iterator: Insercions a la part posterior del contenidor.
  2. fronter_insert_iterator: Insereix a la part frontal del contenidor.
  3. inserir_iterator: Insereix a qualsevol lloc del contenidor.

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çaRetorna un iterador al primer element del contenidor donat. començar ( contenidor Que)
std :: finalRetorna un iterador a l'element després de l'últim element del contenidor donat. final ( contenidor Que)
std :: rbeginRetorna un iterador invers a l'últim element del contenidor donat. rbegin ( contenidor Que)
std :: RendRetorna 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.