A iterátor v C ++ je objekt podobný ukazovateľovi, ktorý poukazuje na prvok kontajnera STL. Spravidla sa používajú na slučku cez obsah nádoby STL v C ++. Hlavnou výhodou iterátorov STL je to, že robia algoritmy STL nezávislými od typu použitého nádoby. Iterátor môžeme len odovzdať do kontajnerových prvkov namiesto samotného kontajnera do algoritmov STL.
Iterátor vyhlásenie
Každý kontajner v C ++ STL má svoj vlastný iterátor. Musíme teda vyhlásiť iterátora ako:
C++
<type>::iterator it;
kdekoľvek
- typ: Typ nádoby, pre ktorý je iterátor deklarovaný.
- to: Názov priradený k objektu iterátora.
Potom ho môžeme inicializovať priradením nejakého platného iterátora. Ak už máme iterátora, ktorý má byť pridelený v čase delcácie, potom môžeme pomocou vyhlásenia typu preskočiť pomocou. auto kľúčové slovo.
C++auto it = iter
kdekoľvek iter je iterátor priradený novo vytvorenému iterátorovi IT.
Náš Kurz C ++ Zahŕňa použitie iterátorov v STL, čím zabezpečíte, aby ste pochopili, ako prechádzať rôznymi typmi kontajnerov.
Príklad iterátorov
Nižšie uvedený program ilustruje, ako použiť iterátor na prechádzanie vektorovým kontajnerom:
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; }
Výstup
1 2 3 4 5
Ako ste si možno všimli, že sme použili vektor :: begin () a vektor :: end () funkcia. Tieto funkcie sú členskými funkciami pre Std :: Vector, ktorý vráti iterátor do prvého a jedného prvku po poslednom prvku vektora. Používame iterátory, ktoré sa vrátia, sú tieto funkcie, aby sme iterovali vektory.
Funkcie iterátora kontajnera
C ++ STL poskytuje niektoré členské funkcie v Kontajner STL To vracia iterátorov aspoň do prvého a posledného prvku. Tieto členské funkcie sú definované takmer vo všetkých kontajneroch STL (ponechávajú niektoré obmedzené prístupové kontajnery ako stoh front ) s rovnakým menom pre konzistentnosť.
V nasledujúcej tabuľke sú uvedené všetky metódy, ktoré vrátia iterátor do kontajnerov:
Funkcia iterátora | Návratnosť |
|---|---|
začať () | Vráti iterátor na začiatok kontajnera. |
koniec () | Vráti iterátor k teoretickému prvku hneď po poslednom prvku kontajnera. |
cbegin () | Vráti konštantný iterátor na začiatok kontajnera. Konštantný iterátor nemôže upraviť hodnotu prvku, na ktorý ukazuje. |
pár () reťazec concat java | Vráti konštantný iterátor k teoretickému prvku hneď za posledným prvkom kontajnera. |
rbegin () | Vráti spätný iterátor na začiatok kontajnera. |
render () | Vráti spätný iterátor k teoretickému prvku hneď po poslednom prvku kontajnera. |
Crbegin () | Vráti konštantný spätný iterátor na začiatok kontajnera. |
Crend () | Vráti konštantný reverzný iterátor k teoretickému prvku hneď po poslednom prvku kontajnera. |
Napríklad ak vec je názov vektora, potom môžeme použiť vyššie uvedené metódy, ako je uvedené nižšie:
C++vec.begin() vec.rbegin() vec.cbegin() vec.crbegin() vec.end() vec.rend() vec.cend() vec.crend()
Operácie iterátorov
Rovnako ako aritmetika ukazovateľa Existujú niektoré operácie, ktoré sú povolené na iterátoroch C ++. Používajú sa na zabezpečenie rôznych funkcií, ktoré zvyšujú dôležitosť iterátorov. Existuje 5 platných Operácie iterátora v C ++ :
- Dereferencie iterátorov
- Zvyšovanie/znižovanie iterátorov
- Pridanie/odčítanie celého čísla iterátorom
- Odčítanie iného iterátora
- Porovnanie iterátorov
Dereferencie iterátorov
Operácia dereferencie umožňuje používateľom k tomu prístup alebo aktualizácia Hodnota prvku zameraného iterátorom. Používame (*) presmerovanie dereferenčným iterátorom rovnako ako ukazovatele.
C++// Access *it; // Update *it = new_val;
kdekoľvek new_val je nová hodnota priradená k prvku, ktorý zdôrazňuje iterátor to .
Zvyšovanie/znižovanie iterátorov
Iterátor môžeme zvýšiť alebo znížiť pomocou použitia 1 (++) alebo (-) operátori resp. Operácia prírastku presunie iterátor k ďalšiemu prvku v kontajneri, zatiaľ čo operácia poklesu presunie iterátor do predchádzajúceho prvku.
C++it++; // post-increment ++it; // pre-increment it--; // post-decrement --it; // pre-decrement
Pridanie/odčítanie celého čísla iterátorom
Od iterátorov môžeme tiež pridať alebo odpočítať celé číslo. Bude viac iterátorom ďalšej alebo predchádzajúcej pozície podľa pridanej celej hodnoty.
C++// Addition it + int_val; // Subtraction it - int_val;
kdekoľvek int_val sú celé hodnoty, ktoré sa pridávajú alebo odpočítajú od iterátora to .
Odčítanie iného iterátora
Môžeme odpočítať jedného iterátora od iného, aby sme našli vzdialenosť (alebo počet prvkov) medzi pamäťou, na ktorú smerujú.
C++it1 - it2
Porovnanie iterátorov
Môžeme tiež otestovať dva iterátory toho istého typu proti sebe, aby sme našli vzťah medzi nimi. Môžeme používať relačných operátorov ako (==) rovnosť a (! =) Operátorov nerovnosti spolu s ďalšími relačnými prevádzkovateľmi, ako napríklad< > <= >=.
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
Typy iterátorov v C ++
Iterátory STL možno rozdeliť na základe operácií, ktoré sa na nich môžu vykonať. V C ++ je 5 hlavných typov iterátorov, ktoré sú uvedené v nižšie uvedenej tabuľke spolu s podporovanými kontajnermi a podporovanými operáciami iterátora.
Iterátor | Opis | Podporované kontajnery | Podporované operácie |
|---|---|---|---|
Iterátor | Je to jednosmerný iterátor, ktorý sa používa na čítanie hodnôt. | Vstupný tok | Dereferencia Rovnosť prírastkov |
Iterátor | Je to tiež jednosmerný iterátor, ale používa sa na priradenie hodnôt. Nemôže získať prístup k hodnotám. | Výstupný prúd | Dereferencing (iba napísať) prírastok |
Prepred iterátori | Má prístup a tiež priraďuje hodnoty. Je to kombinácia vstupného aj výstupného iterátora. | Forward_list neurDordered_map UNORDANED_SET | Dereferencia Rovnosť prírastkov |
Obojsmerné iterátory | Môže sa pohybovať v oboch smeroch vpred alebo dozadu. Kontajnery, ako je sada zoznamov a multimap, podporujú obojsmerné iterátory. | Zoznam mapy set multimap multiset | Dereferencia Rovnosť prírastkov/poklesu |
Iterátory náhodného prístupu | Iterátory s náhodným prístupom sú iterátory, ktoré sa dajú použiť na prístup k prvkom vo vzdialenosti od prvku, ktorý poukazujú na ponúkanie rovnakých funkcií ako ukazovatele. | reťazec poľa vektora v poriadku | Všetko |
Ako sme si možno všimli z vyššie uvedenej tabuľky, okrem vstupných a výstupných iterátorov Keď ideme dolu tabuľkou, typ iterátora obsahuje funkcie vyššie uvedeného iterátora spolu s niektorými novými funkciami.
Iterátorové adaptéry
Adaptéry iterátora v C ++ sú špeciálny typ iterátorov, ktoré sú postavené na tradičných iterátoroch, aby poskytovali špecializované funkcie. V C ++ je veľa iterátorových adaptérov, z ktorých niektoré sú uvedené nižšie:
Typ iterátorových adaptérov | Opis |
|---|---|
Reverzný iterátor | Reverzný iterátor je postavený na obojsmernom alebo nad typom operátora a umožňuje používateľom prechádzať kontajnerom v opačnom smere. |
Streamovať iterátory | Iterátory toku, konkrétne iterátory Istream a Ostream, sú postavené na vstupných a výstupných iterátoroch. Títo iterátori umožňujú používateľom používať toky ako kontajnery. |
Presun iterátorov | Iterátory Move sa používajú na zavedenie sémantiky Move v algoritmoch STL. Iterátori kroku presúvajú vlastníctvo skopírovaných údajov o kontajneroch do kontajnera s kopírovaním bez vytvorenia ďalších kópií. |
Iterátor | Iterátory vložiek vám umožňujú vložiť dané prvky do určitej polohy do nádoby. V C ++ sú tri iterátory vložiek:
Títo iterátori je možné vytvoriť pomocou back_inserter () front_inserter () vložiť () Funkcie v C ++. |
Iterátorové úžitkové funkcie v C ++
C ++ STL poskytuje rôzne funkcie na zjednodušenie práce s iterátormi. Sú uvedené v nižšie uvedenej tabuľke:
| Funkcia | Opis | Syntax |
|---|---|---|
| STD :: Advance | Postupuje iterátora konkrétnym počtom pozícií. | pokrok ( to n ) |
| Std :: Ďalej | Vráti iterátor, ktorý je určeným počtom pozícií pred daným iterátorom. | najbližší ( to n ) |
| Std :: Predchádzajúci | Vráti iterátor, ktorý je určeným počtom pozícií za daným iterátorom. | predchádzajúci ( to n ) |
| STD :: Vzdialenosť | Vráti počet prvkov medzi dvoma iterátormi. | vzdialenosť ( it1 it2 ) |
| Std :: Začať | Vráti iterátor do prvého prvku daného kontajnera. | začať ( kontajner ) |
| Std :: koniec | Vráti iterátor do prvku nasledujúceho posledného prvku daného kontajnera. | ukončiť ( kontajner ) |
| std :: rbegin | Vráti spätný iterátor do posledného prvku daného kontajnera. | rbegin ( kontajner ) |
| Std :: Rend | Vráti spätný iterátor k prvku predchádzajúcemu prvému prvku danej kontajnera. | robiť ( kontajner ) |
| Std :: vkladač | Vytvorí iterátor vložky, ktorý vkladá prvky do kontajnera v zadanej polohe. | vtiahnutý ( poloha kontajnera ) |
| std :: back_inserter | Vytvorí iterátor vložky, ktorý pripojí prvky na koniec kontajnera. | back_inserter ( kontajner ) |
| Std :: front_inserter | Vytvorí predný iterátor, ktorý vkladá prvky na prednú časť nádoby. | front_inserter ( kontajner ) |
Aplikácie iterátorov s príkladmi
Iterátory sa vo veľkej miere používajú v C ++ na mnoho rôznych účelov pri práci s nádobami STL a algoritmami. Nasledujú niektoré primárne aplikácie iterátorov v C ++, ktoré ich kódom príklady:
Prechádzajúce kontajnery
Prechádzajúce kontajnery STL sú najzákladnejšími aplikáciami iterátorov. V tomto používame funkcie začiatočníkov () a end () na získanie iterátorov začiatku a konca, aby prešli celým kontajnerom. V podstate neustále zvyšujeme iterátor začiatku, až kým sa nebude rovnať koncu.
Príklad
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; }
Výstup
10 20 30 40 50
Ako je znázornené vo vyššie uvedenom kóde, prechádzame nastaveným kontajnerom. Podobne môžeme použiť rovnaký prístup na prechádzanie akéhokoľvek kontajnera.
Zvrátenie nádoby
Reverzné iterátory vám umožňujú prejsť kontajnerom od konca do začiatku bez toho, aby ste museli manuálne zvládnuť zvrátenie.
Príklad
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; }
Výstup
50 40 30 20 10
Algoritmy nezávislé od nádob
Iterátory umožňujú algoritmom pracovať s akýmikoľvek funkciami tvorby typu kontajnera, ako je STD :: Sort () Std :: find () a Std :: for_each () flexibilnejšie. Namiesto skutočného kontajnera môžete prejsť iterátormi.
Príklad
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; }
Výstup
10s in Vector: 2 10s in Multiset: 3
Ďalšie aplikácie iterátorov
Existuje viac aplikácií iterátorov STL:
- Výpočet vzdialenosti: Použitie iterátorov STD :: DISIFE () pomáhajú vypočítať počet prvkov medzi dvoma pozíciami v nádobe.
- Streamovanie iterácie: Iterátory toku vám umožňujú liečiť vstupné/výstupné toky, ako sú kontajnery, ktoré uľahčujú čítanie a zapisujú do tokov pomocou algoritmov STL.
- Presuňte sémantiku v algoritmoch STL: Pohyb Iterátorov predstavuje sémantiku sťahovania v algoritmoch STL, ktorá pomáha zvyšovať výkon a efektívnosť tým, že sa vyhýba zbytočným kopírovaniu. Údaje sa budú pohybovať podľa pravidiel sémantiky presunu.
- Vlastné iterátory pre dátové štruktúry: Vlastné iterátory je možné implementovať pre dátové štruktúry bez STL, ako sú stromy alebo grafy, aby poskytli podporu algoritmov STL a mnohých ďalších funkcií. Možno budeme musieť dodržiavať niekoľko súborov pravidiel a konvencií, aby sme zabezpečili správne zvýšenie znižovania a iné operácie.