logo

Iteratori în C ++ STL

Un  Iterator în C ++  este un obiect asemănător pointerului care indică un element al containerului STL. În general, sunt utilizate pentru a se bucura prin conținutul recipientului STL în C ++. Principalul avantaj al iteratorilor STL este că acestea fac ca algoritmii STL să fie independenți de tipul de container utilizat. Putem trece doar iteratorul la elementele containerului în loc de containerul în sine la algoritmii STL.

Declarația iteratorului

Fiecare container din C ++ STL are propriul său iterator. Deci trebuie să declarăm un iterator ca:



C++
<type>::iterator it; 

unde

  • tip: Tipul de container pentru care este declarat iteratorul.
  • IT: Numele atribuit obiectului iterator.

Îl putem inițializa apoi alocând un iterator valid. Dacă avem deja un iterator care trebuie atribuit în momentul delcarației, atunci putem omite declarația de tip folosind auto Cuvânt cheie.

C++
auto it = iter 

unde iter este iteratorul atribuit iteratorului nou creat.



Noastre Curs C ++ Acoperă utilizarea iteratorilor în STL, asigurându -vă că înțelegeți cum să traversați diferite tipuri de containere.

Exemplu de iteratori

Programul de mai jos ilustrează modul de utilizare a iteratorului pentru a traversa containerul 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; } 

Ieșire
1 2 3 4 5 

După cum ați observat că am folosit vector :: begin () și vector :: end () funcţie. Aceste funcții sunt funcțiile de membru la std :: vector care returnează iteratorul la primul și un element după ultimul element al vectorului. Folosim returnarea iteratorilor să fie aceste funcții pentru a itera vectorii.



Funcții de iterator de container

C ++ STL oferă unele funcții de membru în Container STL care returnează iteratorii la cel puțin primul și ultimul element. Aceste funcții de membru sunt definite în aproape tot recipientul STL (lăsând unele containere de acces limitate, cum ar fi stivă coadă ) cu același nume pentru consecvență.

Următorul tabel listează toate metodele care returnează iteratorul în containere:

Funcția iteratorului

Valoarea de returnare

ÎNCEPE()

Returnează un iterator la începutul containerului.

Sfârşit()

Returnează un iterator la elementul teoretic imediat după ultimul element al containerului.

cbegin ()

Returnează un iterator constant la începutul containerului. Un iterator constant nu poate modifica valoarea elementului pe care îl indică.

Câteva ()

versiuni Android

Returnează un iterator constant la elementul teoretic imediat după ultimul element al containerului.

rbegin ()

Returnează un iterator invers la începutul containerului.

face()

Returnează un iterator invers la elementul teoretic imediat după ultimul element al containerului.

CRBEGIN ()

Returnează un iterator invers constant la începutul containerului.

Crend ()

Returnează un iterator invers constant la elementul teoretic imediat după ultimul element al containerului.

De exemplu, dacă un lucru este numele vectorului, atunci putem folosi metodele de mai sus, așa cum se arată mai jos:

C++
vec.begin() vec.rbegin() vec.cbegin() vec.crbegin() vec.end() vec.rend()  vec.cend() vec.crend() 

Operațiuni iteratoare

La fel ca aritmetica pointerului, există unele operații care sunt permise pe iteratorii C ++. Sunt folosite pentru a oferi funcționalități diferite care crește importanța iteratorilor. Există 5 valabile Operații iterator în C ++ :

  • Dereferința iteratorilor
  • Creșterea/decretarea iteratorilor
  • Adăugarea/scăderea numărului întreg la iteratori
  • Scăzând un alt iterator
  • Compararea iteratorilor

Dereferința iteratorilor

Operațiunea de referință permite utilizatorilor acces sau actualizare Valoarea elementului indicat de iterator. Folosim (*) operator de indirecție la iteratori de referință la fel ca indicatorii.

C++
// Access *it; // Update *it = new_val;  

unde new_val este noua valoare atribuită elementului indicat de iterator ea .

Creșterea/decretarea iteratorilor

Putem crește sau decreta iteratorul cu 1 folosind (++) sau (-) operatori respectiv. Operația de increment mută iteratorul la următorul element din container în timp ce operația de decrement mută iteratorul la elementul anterior.

C++
it++; // post-increment ++it; // pre-increment it--; // post-decrement --it; // pre-decrement 

Adăugarea/scăderea numărului întreg la iteratori

De asemenea, putem adăuga sau scădea o valoare întreagă din iteratori. Acesta va fi mai mult iteratorul următor sau poziția anterioară în funcție de valoarea adăugată a întregului.

C++
// Addition it + int_val;  // Subtraction it - int_val;  

unde Int_val este valorile întregi care sunt adăugate sau scăzute de la iterator ea .

Scăzând un alt iterator

Putem scădea un iterator de la altul pentru a găsi distanța (sau numărul de elemente) între memoria pe care o indică.

C++
it1 - it2 

Compararea iteratorilor

De asemenea, putem testa cei doi iteratori de același tip unul față de celălalt pentru a găsi relația dintre ele. Putem folosi operatorii relaționali precum (==) egalitate și (! =) Operatori de inegalitate împreună cu alți operatori relaționali, cum ar fi< > <= >=.

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 

Tipuri de iteratori în C ++

Iteratoarele STL pot fi împărțite pe baza operațiunilor care pot fi efectuate pe ele. Există 5 tipuri principale de iteratori în C ++, care sunt enumerate în tabelul de mai jos, împreună cu containerele acceptate și operațiunile de iterator acceptate.

Iterator

Descriere

Containere acceptate

Operațiuni acceptate

Iterator de intrare

Este un iterator unic folosit pentru a citi valorile.

Flux de intrare

Dereferință egalitatea de creștere

Iterator de ieșire

Este, de asemenea, un iterator unic, dar folosit pentru a atribui valorile. Nu poate accesa valorile.

Flux de ieșire

Dereferință (numai scriere) Creștere

Iteratori înainte

Poate accesa și atribui valorile. Este combinația atât a iteratorului de intrare cât și a ieșirii.

Forward_list Unordered_map Unordered_set

Dereferință egalitatea de creștere

Iteratori bidirecționali

Se poate deplasa în ambele direcții, fie în față, fie înapoi. Containerele precum setul de listă și multimap acceptă iteratori bidirecționali.

Lista setează multiset multimap multimap

Egalitate de creștere/scădere a egalității

Iteratori de acces aleatoriu

Iteratorii cu acces aleatoriu sunt iteratori care pot fi folosiți pentru a accesa elemente la distanță de elementul pe care îl indică pentru a oferi aceeași funcționalitate ca și indicatoarele.

Vector Deque Array șir

eroare: nu s-a putut găsi sau încărca clasa principală

Toate

După cum am putut observa din tabelul de mai sus, în afară de iteratorii de intrare și ieșire Pe măsură ce coborâm pe tabel, tipul iterator conține caracteristicile iteratorului de mai sus împreună cu câteva caracteristici noi.

Adaptoare iterator

Adaptoarele de iterator în C ++ sunt tipul special de iteratori care sunt construiți pe iteratori tradiționali pentru a oferi funcționalități specializate. Există multe adaptoare de iterator în C ++ unele dintre ele fiind prezentate mai jos:

Tip de adaptoare iterator

Descriere

Iterator invers

Iteratorul invers este construit pe tipul de operator bidirecțional sau de mai sus și permite utilizatorilor să traverseze containerul în direcția inversă.

Flux iteratoare

Iteratoarele de flux și anume ISTREAM și Iteratoarele Ostream sunt construite pe iteratoarele de intrare și, respectiv, de ieșire. Aceste iteratoare permit utilizatorilor să utilizeze fluxurile ca containere.

Mutați iteratorii

Iteratoarele de mișcare sunt utilizate pentru a introduce semantica de mișcare în algoritmii STL. Iteratoarele de mișcare mută proprietatea datelor containerului copiat în containerul de copiere fără a crea copii suplimentare.

Iterator de insert

Iteratoarele de insertor vă permite să introduceți elementele date într -o anumită poziție în container. Există trei iteratori de insertor în C ++:

  1. back_insert_iterator: Inserții în partea din spate a containerului.
  2. front_insert_iterator: Intrări în partea din față a containerului.
  3. insert_iterator: Intrări în oriunde în container.

Aceste iteratoare pot fi create folosind back_inserter () front_inserter () introduce() Funcții în C ++.

Iterator funcții de utilitate în C ++

C ++ STL oferă diverse funcții pentru a simplifica lucrările cu iteratorii. Sunt listate în tabelul de mai jos:

Funcţie Descriere Sintaxă
std :: avans Avansează un iterator de un număr specific de poziții. avans ( it n )
Std :: Următorul Returnează iteratorul care este un număr specificat de poziții înaintea iteratorului dat. Următorul ( it n )
Std :: prev Returnează iteratorul care este un număr specificat de poziții din spatele iteratorului dat. anterior ( it n )
std :: distanță Returnează numărul de elemente între două iteratoare. distanţă ( IT1 IT2 )
std :: începeReturnează un iterator la primul element al containerului dat. ÎNCEPE ( container )
Std :: EndReturnează un iterator la elementul care urmează ultimul element al containerului dat. Sfârşit ( container )
std :: rbeginReturnează un iterator invers la ultimul element al containerului dat. rbegin ( container )
Std :: RendReturnează un iterator invers la elementul precedent primul element al containerului dat. face ( container )
std :: insertor Creează un iterator de inserție care introduce elemente într -un container într -o poziție specificată. insertor ( Poziția containerului )
std :: back_inserter Creează un iterator de inserție din spate care anexează elemente la sfârșitul unui container. back_inserter ( container )
std :: front_inserter Creează un iterator de inserție față care introduce elemente în fața unui recipient. front_inserter ( container )

Aplicații de iteratori cu exemple

Iteratoarele sunt utilizate pe scară largă în C ++ în mai multe scopuri diferite, în timp ce lucrați cu containere și algoritmi STL. Urmează câteva aplicații primare ale iteratorilor în C ++ pe care le exemple de cod:

Traversarea containerelor

Traversarea containerelor STL este cea mai de bază aplicație a iteratorilor. În aceasta folosim funcțiile Begin () și End () pentru a obține iteratoarele început și sfârșit pentru a traversa întregul recipient. Practic, continuăm să creștem iteratorul de început până când nu este egal cu sfârșitul.

Exemplu

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; } 

Ieșire
10 20 30 40 50 

Așa cum se arată în codul de mai sus, traversăm containerul set. În mod similar, putem folosi aceeași abordare pentru a traversa orice container.

Inversarea unui container

Iteratoarele inversă vă permit să parcurgeți un recipient de la sfârșit până la început, fără a fi nevoie să gestionați manual inversarea.

Exemplu

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; } 

Ieșire
50 40 30 20 10 

Algoritmi independenți de containere

Iteratoarele permit algoritmilor să funcționeze cu orice tip de container care să facă funcții precum std :: sort () std :: find () și std :: for_each () mai flexibil. Puteți trece iteratori în loc de containerul propriu -zis.

Exemplu

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; } 

Ieșire
10s in Vector: 2 10s in Multiset: 3

Aplicații suplimentare ale iteratorilor

Există mai multe aplicații de iteratori STL:

  • Calculul distanței: Utilizarea iteratorilor std :: distanță () ajută la calcularea numărului de elemente între două poziții într -un container.
  • Iterarea fluxului: Iteratoarele de flux vă permit să tratați fluxurile de intrare/ieșire, cum ar fi containerele care facilitează citirea și scrierea la fluxuri folosind algoritmi STL.
  • Mutați semantica în algoritmi STL: Move Iterators introduce semantica de mișcare în algoritmii STL, ceea ce ajută la creșterea performanței și eficienței, evitând copierea inutilă. Datele vor fi mutate în conformitate cu regulile semanticii de mișcare.
  • Iteratori personalizați pentru structuri de date: Iteratoarele personalizate pot fi implementate pentru structuri de date non-STL, cum ar fi copaci sau grafice, pentru a oferi suportul pentru algoritmi STL și multe alte caracteristici. Este posibil să fie nevoie să urmărim câteva seturi de reguli și convenții pentru a oferi o scădere corespunzătoare și alte operațiuni.