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:
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čni | Vrne iterator v prvi element dane vsebnika. | začne ( zabojnik ) |
| STD :: END | Vrne iterator v element po zadnjem elementu dane vsebnika. | konec ( zabojnik ) |
| STD :: rbegin | Vrne povratni iterator v zadnji element dane vsebnika. | Rbegin ( zabojnik ) |
| STD :: REND | Vrne 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.