logo

Iterátoři v C ++ STL

An  iterátor v C ++  je objekt podobný ukazateli, který ukazuje na prvek kontejneru STL. Obecně se používají ke smyčku skrz obsah kontejneru STL v C ++. Hlavní výhodou iterátorů STL je to, že vytvářejí algoritmy STL nezávislé na typu použitého kontejneru. Iterátor můžeme jen předat na prvky kontejneru namísto samotného kontejneru do algoritmů STL.

Deklarace iterátoru

Každý kontejner v C ++ STL má svůj vlastní iterátor. Musíme tedy prohlásit iterátora jako:



C++
<type>::iterator it; 

kde

  • typ: Typ kontejneru, pro který je iterátor deklarován.
  • to: Název přiřazené objektu Iterator.

Poté jej můžeme inicializovat přiřazením nějakého platného iterátoru. Pokud již máme iterátora, který má být přiřazen v době delcaration, můžeme vynechat deklaraci typu pomocí auto klíčové slovo.

C++
auto it = iter 

kde iter je iterátor přiřazen k nově vytvořenému Iterátorovi.



Náš Kurz C ++ Pokrývá použití iterátorů v STL a zajišťuje, že pochopíte, jak procházet různými typy kontejnerů.

Příklad iterátorů

Níže uvedený program ukazuje, jak používat iterátor k procházení vektorového kontejneru:

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 

Jak jste si možná všimli Vector :: začátek () a vector :: end () funkce. Tyto funkce jsou funkcemi pro STD :: vektor, který vrací iterátor do prvního a jeden prvek za posledním prvkem vektoru. Používáme iterátory, které se vrací tyto funkce k iteraci vektorů.



Funkce kontejneru

C ++ STL poskytuje některé členské funkce v STL kontejner to iterátory vrací alespoň na první a poslední prvek. Tyto členské funkce jsou definovány téměř ve všech kontejneru STL (ponechávají některé omezené přístupové kontejnery jako stoh fronta ) se stejným názvem pro konzistenci.

Následující tabulka uvádí všechny metody, které vrací iterátor do kontejnerů:

Funkce iterátoru

Návratová hodnota

začít()

Vrátí iterátor na začátek kontejneru.

konec()

Vrátí iterátor do teoretického prvku těsně po posledním prvku kontejneru.

cbegin ()

Vrátí konstantní iterátor na začátek kontejneru. Konstantní iterátor nemůže upravit hodnotu prvku, na který ukazuje.

několik()

kolik je 10 z 60

Vrátí konstantní iterátor k teoretickému prvku těsně po posledním prvku kontejneru.

rbegin ()

Vrátí reverzní iterátor na začátek kontejneru.

render ()

Vrátí reverzní iterátor do teoretického prvku těsně po posledním prvku kontejneru.

crbegin ()

Vrátí konstantní reverzní iterátor na začátek kontejneru.

Crend ()

Vrátí konstantní reverzní iterátor k teoretickému prvku těsně po posledním prvku kontejneru.

Například pokud věc je název vektoru, pak můžeme použít výše uvedené metody, jak je uvedeno níže:

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

Operace iterátorů

Stejně jako aritmetika ukazatele existuje několik operací, které jsou povoleny na iterátorech C ++. Používají se k poskytování různých funkcí, které zvyšují význam iterátorů. Existuje 5 platných Operace iterátoru v C ++ :

  • Dereferenční iterátoři
  • Inkrement/snižování iterátorů
  • Iterátory přidání/odečtení celého celého
  • Odečtení jiného iterátora
  • Porovnání iterátorů

Dereferenční iterátoři

Operace dereferencí umožňuje uživatelům přístup nebo aktualizace Hodnota prvku namířená iterátorem. Používáme (*) nepřímo operátor Dereference iterátorů stejně jako ukazatele.

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

kde new_val je nová hodnota přiřazená k prvku namířené iterátorem to .

Inkrement/snižování iterátorů

Iterátor můžeme zvýšit nebo snížit o 1 pomocí 1 pomocí (++) nebo (-) operátoři respektive. Operace přírůstku přesune iterátor k dalšímu prvku v kontejneru, zatímco operace deníku přesune iterátor k předchozímu prvku.

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

Iterátory přidání/odečtení celého celého

Můžeme také přidat nebo odečíst celočíselnou hodnotu od iterátorů. Bude více iterátora další nebo předchozí pozice podle přidané celočíselné hodnoty.

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

kde int_val jsou celočíselné hodnoty, které se přidávají nebo odečítají od iterátoru to .

Odečtení jiného iterátora

Můžeme odečíst jednoho iterátora od druhého, abychom našli vzdálenost (nebo počet prvků) mezi pamětí, na kterou ukazují.

C++
it1 - it2 

Porovnání iterátorů

Můžeme také otestovat dva iterátory stejného typu proti sobě navzájem, abychom našli vztah mezi nimi. Můžeme použít relační operátory jako (==) rovnost a (! =) Operátory nerovnosti spolu s dalšími relačními operátory, jako jsou< > <= >=.

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átorů v C ++

Iterátoři STL lze rozdělit na základě operací, které na nich mohou být prováděny. V C ++ je 5 hlavních typů iterátorů, které jsou uvedeny v níže uvedené tabulce spolu s podporovanými kontejnery a podporovanými iterátorovými operacemi.

Iterátor

Popis

Podporované kontejnery

Podporované operace

Vstupní iterátor

Jedná se o jednosměrný iterátor používaný ke čtení hodnot.

Vstupní proud

Dereferencování rovnosti přírůstku

Výstupní iterátor

Je to také jednosměrný iterátor, ale používá se k přiřazení hodnot. Nemůže získat přístup k hodnotám.

Výstupní proud

Dereferenční (pouze zápis) přírůstek

Přední iterátoři

Může přístup a také přiřadit hodnoty. Je to kombinace vstupního i výstupního iterátoru.

Forward_List UNORDERED_MAP UNORDERED_SET

Dereferencování rovnosti přírůstku

Obousměrné iterátoři

Může se pohybovat v obou směrech vpřed nebo dozadu. Kontejnery jako sada seznamů a multimap podporuje obousměrné iterátory.

Seznam mapových sad multimap multiset

Dereferenční přírůstek/rovnost snižování

Iterátoři náhodného přístupu

Iterátoři náhodného přístupu jsou iterátoři, kteří mohou být použity k přístupu k prvkům ve vzdálenosti od prvku, který poukazují na nabídku stejné funkce jako ukazatele.

Řetězec vektorového pole Deque

sanjay dutt a

Vše

Jak jsme si možná všimli z výše uvedené tabulky, kromě iterátorů vstupů a výstupů Když jdeme dolů ze stolu, typ iterátoru obsahuje funkce výše uvedeného iterátoru spolu s některými novými funkcemi.

Iterátorské adaptéry

Iterátorové adaptéry v C ++ jsou zvláštním typem iterátorů, které jsou postaveny na tradičních iterátorech, které poskytují specializované funkce. Existuje mnoho iterátorových adaptérů v C ++, z nichž některé jsou uvedeny níže:

Typ adaptérů iterátorů

Popis

Reverzní iterátor

Reverzní iterátor je postaven na obousměrných nebo vyšších typech operátoru a umožňuje uživatelům procházet kontejnerem v opačném směru.

Streamují iterátoři

Iterátoři proudu, jmenovitě iStream a Ostream Iterátory jsou postaveny na vstupních a výstupních iterátorech. Tito iterátoři umožňují uživatelům používat proudy jako kontejnery.

Přesunout iterátory

Iterátoři pohybu se používají k zavedení sémantiky přesunu v algoritmech STL. Iterátoři pohybu přesouvají vlastnictví dat zkopírovaných kontejnerů do kopírovacího kontejneru bez vytvoření dalších kopií.

Vložený iterátor

Iterátory vložení umožňují vložit dané prvky do určité polohy v kontejneru. V C ++ jsou tři iterátory vložení:

  1. back_insert_iterator: Vloží se na zadní stranu kontejneru.
  2. front_insert_iterator: Vložky na přední straně kontejneru.
  3. insert_iterator: Vkládá kdekoli v kontejneru.

Tyto iterátoři lze vytvořit pomocí back_inserter () front_inserter () vložit() Funkce v C ++.

Funkce iterátoru v C ++

C ++ STL poskytuje různé funkce pro zjednodušení práce s iterátory. Jsou uvedeny v níže uvedené tabulce:

Funkce Popis Syntax
Std :: Advance Posílá iterátor o konkrétním počtu pozic. záloha ( n )
STD :: Další Vrátí iterátor, který je specifikovaným počtem pozic před daným iterátorem. další ( n )
STD :: Předchozí Vrátí iterátor, který je zadaným počtem pozic za daným iterátorem. předchozí ( n )
STD :: DISTANCE Vrátí počet prvků mezi dvěma iterátory. vzdálenost ( IT1 IT2 )
STD :: BEETVrátí iterátor do prvního prvku daného kontejneru. začít ( kontejner )
STD :: EndVrátí iterátor do prvku po posledním prvku daného kontejneru. konec ( kontejner )
std :: rbeginVrátí reverzní iterátor do posledního prvku daného kontejneru. rbegin ( kontejner )
STD :: RENDVrátí reverzní iterátor do prvku před prvním prvkem dané kontejneru. dělá ( kontejner )
STD :: INSERTER Vytvoří iterátor vložení, který vkládá prvky do kontejneru do zadané polohy. vložení ( poloha kontejneru )
std :: back_inserter Vytvoří zadní iterátor, který připojí prvky na konec kontejneru. back_inserter ( kontejner )
std :: front_inserter Vytvoří přední iterátor vložení, který vkládá prvky do přední části kontejneru. front_inserter ( kontejner )

Aplikace iterátorů s příklady

Iterátoři se pro mnoho různých účelů rozsáhle používají v C ++ při práci s kontejnery a algoritmy STL. Následuje některé primární aplikace iterátorů v C ++, které jejich příklady kódu:

Procházející kontejnery

Procházení kontejnerů STL je nejzákladnější aplikací iterátorů. V tomto používáme funkce začátek () a end (), abychom začali iterátory pro začátek a ukončili iterátory, aby procházeli celým kontejnerem. V zásadě pokračujeme v přírůstku iterátoru, dokud se nerovná konec.

Pří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 

Jak je uvedeno ve výše uvedeném kódu, procházíme nastaveným kontejnerem. Podobně můžeme použít stejný přístup k procházení jakékoli kontejneru.

Obrácení kontejneru

Reverzní iterátoři vám umožňují procházet kontejnerem od konce do začátku, aniž byste museli ručně manipulovat s obrácením.

Pří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é na kontejneru

Iterátoři umožňují algoritmům pracovat s jakýmkoli funkcí typu kontejneru, jako je std :: sort () std :: find () a std :: for_each () flexibilnější. Místo skutečného kontejneru můžete předat iterátory.

Pří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

Další aplikace iterátorů

Existuje více aplikací iterátorů STL:

  • Výpočet vzdálenosti: Používání iterátorů STD :: DISTANCE () pomáhá vypočítat počet prvků mezi dvěma pozicemi v kontejneru.
  • Streamovací iterace: Streamované iterátory vám umožňují léčit vstupní/výstupní proudy, jako jsou kontejnery, což usnadňuje čtení a zápis do proudů pomocí algoritmů STL.
  • Přesuňte sémantiku v algoritmech STL: Iterátoři přesunu zavádí sémantiku přesunu v algoritmech STL, což pomáhá při zvyšování výkonu a účinnosti tím, že se zabrání zbytečnému kopírování. Data budou přesunuty podle pravidel sémantiky.
  • Vlastní iterátoři pro datové struktury: Vlastní iterátoři mohou být implementováni pro datové struktury non-STL, jako jsou stromy nebo grafy, aby poskytovaly podporu pro algoritmy STL a mnoho dalších funkcí. Možná budeme muset dodržovat několik souborů pravidel a konvencí, abychom poskytli řádné zvýšení snižování a další operace.