logo

Iterátory v C ++ STL

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:

  1. back_insert_iterator: Vložky v zadnej časti nádoby.
  2. front_insert_iterator: Vložky v prednej časti nádoby.
  3. insert_iterator: Vložky kdekoľvek v nádobe.

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 :: koniecVráti iterátor do prvku nasledujúceho posledného prvku daného kontajnera. ukončiť ( kontajner )
std :: rbeginVráti spätný iterátor do posledného prvku daného kontajnera. rbegin ( kontajner )
Std :: RendVrá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.