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í:
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 :: BEET | Vrátí iterátor do prvního prvku daného kontejneru. | začít ( kontejner ) |
| STD :: End | Vrátí iterátor do prvku po posledním prvku daného kontejneru. | konec ( kontejner ) |
| std :: rbegin | Vrátí reverzní iterátor do posledního prvku daného kontejneru. | rbegin ( kontejner ) |
| STD :: REND | Vrá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.