logo

Iteratorji v C ++ STL

An  iterator v C ++  je kazalec podoben predmet, ki kaže na element vsebnika STL. Na splošno se uporabljajo za zanko skozi vsebino vsebnika STL v C ++. Glavna prednost iteratorjev STL je, da naredijo algoritme STL neodvisno od vrste uporabljene vsebnika. Iterator lahko samo prenesemo na elemente zabojnikov namesto samega vsebnika do algoritmov STL.

Iterator deklaracija

Vsak vsebnik v C ++ STL ima svoj iterator. Zato moramo iterator razglasiti za:



C++
<type>::iterator it; 

Kje

  • tip: Vrsta vsebnika, za katero je razglašen iterator.
  • IT: Ime, dodeljeno objektu iteratorja.

Nato ga lahko inicializiramo tako, da dodelimo nekaj veljavnega iteratorja. Če že imamo iterator, ki ga bomo dodelili v času delitve samodejno Ključna beseda.

C++
auto it = iter 

Kje iter Ali je iterator dodeljen novoustanovljenemu iteratorju.



Naše C ++ tečaj Zajema uporabo iteratorjev v STL, kar zagotavlja, da razumete, kako prečkati različne vrste vsebnika.

Primer iteratorjev

Spodnji program ponazarja, kako uporabiti iterator za prečkanje vektorske vsebnika:

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

Izhod
1 2 3 4 5 

Kot ste morda opazili, smo uporabili vektor :: začetek () in Vector :: End () delovanje. Te funkcije so članske funkcije do vektorja std ::, ki iterator vrne v prvi in ​​en element po zadnjem elementu vektorja. Uporabljamo iteratorje, ki se vračajo, da bodo te funkcije za ponovitev vektorjev.



Funkcije iteratorja vsebnika

C ++ STL ponuja nekatere članske funkcije v STL posoda To vrača iteratorje vsaj prvemu in zadnjemu elementu. Te članske funkcije so opredeljene v skoraj vseh posodah STL (puščajo nekaj omejenih zabojnikov za dostop, kot so STAK čakalna vrsta ) z istim imenom za doslednost.

Naslednja tabela navaja vse metode, ki vračajo iterator v zabojnike:

Funkcija iteratorja

Povratna vrednost

začeti ()

Vrne iterator na začetek vsebnika.

konec ()

Iterator vrne na teoretični element tik po zadnjem elementu vsebnika.

cbegin ()

Vrne konstantni iterator na začetek vsebnika. Stalni iterator ne more spremeniti vrednosti elementa, na katerega kaže.

nekaj ()

java string join

Konstanten iterator vrne na teoretični element tik po zadnjem elementu vsebnika.

rbegin ()

Vrne povratni iterator na začetek vsebnika.

Render ()

Povratni iterator vrne na teoretični element tik po zadnjem elementu vsebnika.

crbegin ()

Vrne konstantni povratni iterator na začetek vsebnika.

Crend ()

Konstanten povratni iterator vrne na teoretični element tik po zadnjem elementu vsebnika.

Na primer, če stvar je ime vektorja, potem lahko uporabimo zgornje metode, kot je prikazano spodaj:

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

Operacije iteratorjev

Tako kot aritmetika kazalca obstaja nekaj operacij, ki so dovoljene pri iteratorjih C ++. Uporabljajo se za zagotavljanje različnih funkcionalnosti, ki povečujejo pomen iteratorjev. Obstaja 5 veljavnih iteratorske operacije v C ++ :

  • Dereferencing iteratorji
  • Potrjevanje/zmanjševanje iteratorjev
  • Dodajanje/odštevanje celoštevilčnih iteratorjev
  • Odštevanje drugega iteratorja
  • Primerjava iteratorjev

Dereferencing iteratorji

Dereference Delovanje uporabnikom omogoča dostop ali posodobitev Vrednost elementa, ki jo usmerja iterator. Uporabljamo (*) Indirection Operator za odstranjevanje iteratorjev tako kot kazalci.

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

Kje new_val je nova vrednost, dodeljena elementu, ki jo je pokazal iterator to .

Potrjevanje/zmanjševanje iteratorjev

Lahko povečamo ali zmanjšamo iterator za 1 (++) ali (-) operaterji oziroma. Operacija prirasta premakne iterator na naslednji element v vsebnik, medtem ko operacija zmanjšanja premakne iterator na prejšnji element.

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

Dodajanje/odštevanje celoštevilčnih iteratorjev

Iteratorje lahko dodamo ali odštejemo tudi celo število vrednosti. Bolj bo namenjen naslednjem ali prejšnjem položaju v skladu z dodano celotno vrednostjo.

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

Kje int_val je celo število vrednosti, ki se dodajajo ali odštejejo od iteratorja to .

Odštevanje drugega iteratorja

Enega iteratorja lahko odštejemo, da najdemo razdaljo (ali število elementov) med spominom, na katerega kažejo.

C++
it1 - it2 

Primerjava iteratorjev

Prav tako lahko preizkusimo dva iteratorja iste vrste drug proti drugemu, da bi našli razmerje med njima. Lahko uporabimo relacijske operaterje, kot so (==) enakost in (! =) Operaterji neenakosti, skupaj z drugimi relacijskimi operaterji, kot so< > <= >=.

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 

Vrste iteratorjev v C ++

Iteratorje STL lahko razdelimo na podlagi operacij, ki jih je mogoče izvesti na njih. V C ++ je 5 glavnih vrst iteratorjev, ki so navedene v spodnji tabeli, skupaj s podprtimi zabojniki in podprtimi operacijami iteratorjev.

Iterator

Opis

Podprti zabojniki

Podprte operacije

Iterator vhoda

Gre za enosmerni iterator, ki se uporablja za branje vrednosti.

Vhodni tok

Dereferenca Enakost prirasta

Izhodni iterator

Je tudi enosmerni iterator, vendar se uporablja za dodelitev vrednosti. Ne more dostopati do vrednosti.

Izhodni tok

Prirast (samo za pisanje)

Iteratorji naprej

Lahko dostopa in dodeli vrednosti. Je kombinacija vhodnega in izhodnega iteratorja.

Forward_list UnRored_Map UnRorred_set

Dereferenca Enakost prirasta

Dvosmerni iteratorji

Lahko se premika v obe smeri bodisi v naprej bodisi nazaj. Zabojniki, kot sta Seznam seznama in multimap, podpira dvosmerne iteratelje.

Seznam zemljevida Nastavi Multimap Multiset

Dereference, ki povečuje/zmanjša enakost

Iteratorji naključnega dostopa

Iteratorji z naključnim dostopom so iteratorji, ki jih lahko uporabimo za dostop do elementov na razdalji od elementa, na katerega kažejo, da ponujajo enako funkcionalnost kot kazalci.

Vektorski niz deque

primerljiv niz

Vse

Kot smo morda opazili iz zgornje tabele, razen vhodnih in izhodnih iteratorjev Ko se spustimo po tabeli, vrsta iteratorja vsebuje značilnosti zgornjega iteratorja skupaj z nekaterimi novimi funkcijami.

Adapterji iteratorja

Adapterji iteratorja v C ++ so posebna vrsta iteratorjev, ki so zgrajeni nad tradicionalnimi iteratorji, da bi zagotovili specializirano funkcionalnost. V C ++ je veliko iteratorskih adapterjev, od katerih so nekateri navedeni spodaj:

Vrsta adapterjev iteratorja

Opis

Povratni iterator

Vzvratni iterator je zgrajen nad dvosmernim ali nad vrsto operaterja in uporabnikom omogoča, da potujejo vsebnik v obratni smeri.

Tok iteratorji

Iteratorji toka, in sicer iTream in omoški iteratorji, so zgrajeni na vhodnih in izhodnih iteratorjih. Ti iteratorji uporabnikom omogočajo uporabo tokov kot zabojnikov.

Premaknite iteratorje

Premik Iteratorji se uporabljajo za uvedbo semantike premika v algoritmih STL. Iteratorji premikanja premaknejo lastništvo kopiranih podatkov za vsebnik v vsebnik za kopiranje, ne da bi ustvarili dodatne kopije.

Iterator vporeditve

Iteratorji vstavljanja vam omogočajo, da vstavite dane elemente v neki položaj v vsebnik. V C ++ so trije vstavni iteratorji:

  1. Back_insert_iterator: Vstavite na zadnji del vsebnika.
  2. Front_insert_iterator: Vstavite na sprednji del vsebnika.
  3. INSERT_ITERATOR: Vstavite kamor koli v posodi.

Te iteratorje lahko ustvarite s pomočjo Back_inserter () front_inserter () vstavi () Funkcije v C ++.

Funkcije uporabnosti iteratorja v C ++

C ++ STL zagotavljajo različne funkcije za poenostavitev dela z iteratorji. So navedeni v spodnji tabeli:

Delovanje Opis Sintaksa
STD :: Vnaprej Napreduje iterator za določeno število položajev. vnaprej ( to n )
STD :: Naprej Vrne iterator, ki je določeno število položajev pred danim iteratorjem. naslednji ( to n )
STD :: Prev Vrne iterator, ki je določeno število položajev za danim iteratorjem. Predod ( to n )
STD :: razdalja Vrne število elementov med dvema iteratorjema. razdalja ( it1 it2 )
STD :: ZačniVrne iterator v prvi element dane vsebnika. začne ( zabojnik )
STD :: ENDVrne iterator v element po zadnjem elementu dane vsebnika. konec ( zabojnik )
STD :: rbeginVrne povratni iterator v zadnji element dane vsebnika. Rbegin ( zabojnik )
STD :: RENDVrne vzvratni iterator v element pred prvim elementom dane vsebnika. naredi ( zabojnik )
STD :: norci Ustvari iterator vstavljanja, ki vstavi elemente v vsebnik v določenem položaju. vstavek ( Položaj zabojnika )
STD :: Back_inserter Ustvari hrbtni vstavki iteratorja, ki dodaja elemente na konec vsebnika. Back_inserter ( zabojnik )
std :: front_inserter Ustvari sprednji vstavni iterator, ki vstavi elemente na sprednji strani vsebnika. Front_inserter ( zabojnik )

Aplikacije iteratorjev s primeri

Iteratorji se med delom s STL in algoritmi obsežno uporabljajo v C ++ za več različnih namenov. Sledi nekaj primarnih aplikacij iteratorjev v C ++, ki so primeri njihove kode:

Prečkanje zabojnikov

Traversing STL zabojniki je najosnovnejša uporaba iteratorjev. V tem uporabimo funkcije začetka () in končne (), da dobimo iteratelje za začetek in končanje za prečkanje celotne vsebnika. V bistvu povečujemo iterator začetka, dokler ni enak koncu.

Primer

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

Izhod
10 20 30 40 50 

Kot je prikazano v zgornji kodi, prečkamo nastavljeni vsebnik. Podobno lahko uporabimo enak pristop za prehod v katero koli posodo.

Preobrat vsebnika

Povratni iteratorji vam omogočajo, da prečkate vsebnik od konca do začetka, ne da bi morali ročno ravnati z preobratom.

Primer

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

Izhod
50 40 30 20 10 

Algoritmi, neodvisni od zabojnikov

Iteratorji omogočajo, da algoritmi delujejo s kakršnimi koli funkcijami tipa vsebnika, kot sta std :: sort () std :: find () in std :: for_each () bolj prilagodljivo. Namesto dejanske vsebnika lahko prenesete iteratorje.

Primer

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

Izhod
10s in Vector: 2 10s in Multiset: 3

Dodatne aplikacije iteratorjev

Obstaja več aplikacij iteratorjev STL:

  • Izračun razdalje: Uporaba iteratorjev STD :: razdalja () pomagajo izračunati število elementov med dvema položajem v posodi.
  • Iteracija toka: Iteratorji toka vam omogočajo, da obravnavate vhodne/izhodne tokove, kot so zabojniki, kar olajša branje in pisanje v tokove z uporabo algoritmov STL.
  • Premaknite semantiko v algoritmih STL: Premik Iteratorji uvaja semantiko premika v algoritmih STL, kar pomaga pri povečanju učinkovitosti in učinkovitosti, saj se izogne ​​nepotrebnemu kopiranju. Podatki bodo premaknjeni v skladu s pravili semantike premika.
  • Iteratorji po meri za strukture podatkov: Iteratorje po meri se lahko implementirajo za podatkovne strukture, ki niso STL, kot so drevesa ali grafi, da zagotovijo podporo za algoritme STL in številne druge funkcije. Morda bomo morali upoštevati nekaj naborov pravil in konvencij, da bomo zagotovili ustrezno povečanje zmanjšanja in druge operacije.