An iterator u C ++ je objekt sličan pokazivaču koji ukazuje na element spremnika STL. Obično se koriste za petlju kroz sadržaj STL spremnika u C ++. Glavna prednost STL iteratora je u tome što oni čine STL algoritme neovisne o vrsti korištenog spremnika. Možemo samo proslijediti iterator na elemente spremnika umjesto samog spremnika na STL algoritme.
Izjava iteratora
Svaki spremnik u C ++ STL ima svoj iterator. Tako moramo proglasiti iterator kao:
C++
<type>::iterator it;
gdje
- tip: Vrsta spremnika za koju je proglašen iterator.
- to: Ime dodijeljeno objektu Iterator.
Tada ga možemo inicijalizirati dodjeljivanjem valjanog iteratora. Ako već imamo iterator koji će biti dodijeljen u vrijeme delkaracije, tada možemo preskočiti deklaraciju tipa koristeći auto ključna riječ.
C++auto it = iter
gdje iter Je li iterator dodijeljen novostvorenom IT Iterator.
Naše C ++ tečaj Pokriva upotrebu iteratora u STL -u osiguravajući da razumijete kako preći različite vrste spremnika.
Primjer iteratora
Donji program ilustrira kako koristiti iterator za prelazak vektorskog spremnika:
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; }
Izlaz
1 2 3 4 5
Kao što ste možda primijetili, koristili smo Vector :: Početak () i Vector :: End () funkcija. Te su funkcije funkcije članova na STD :: vektor koji vraća iterator u prvi i jedan element nakon posljednjeg elementa vektora. Koristimo iteratorni povratak BE ove funkcije za ponavljanje vektora.
Funkcije iteratora spremnika
C ++ STL pruža neke funkcije članova u STL spremnik koji vraćaju iteratore u barem prvi i posljednji element. Ove funkcije članova definirane su u gotovo svim STL spremnik (ostavljaju neke ograničene kontejnere za pristup poput stog red ) s istim imenom za dosljednost.
Sljedeća tablica navodi sve metode koje vraćaju iterator u spremnici:
Iterator funkcija | Povratna vrijednost |
|---|---|
početi() | Vraća iterator na početak spremnika. |
kraj() | Vraća iterator u teorijski element neposredno nakon posljednjeg elementa spremnika. |
CBEGIN () | Vraća stalni iterator na početak spremnika. Stalni iterator ne može izmijeniti vrijednost elementa na koji ukazuje. |
nekoliko() css komentar | Vraća konstantni iterator u teorijski element neposredno nakon posljednjeg elementa spremnika. |
rbegin () | Vraća obrnuti iterator na početak spremnika. |
Render () | Vraća obrnuti iterator u teorijski element neposredno nakon posljednjeg elementa spremnika. |
crbegin () | Vraća konstantni obrnuti iterator na početak spremnika. |
CREND () | Vraća konstantni obrnuti iterator u teorijski element neposredno nakon posljednjeg elementa spremnika. |
Na primjer ako stvar je naziv vektora, tada možemo koristiti gore navedene metode kao što je prikazano u nastavku:
C++vec.begin() vec.rbegin() vec.cbegin() vec.crbegin() vec.end() vec.rend() vec.cend() vec.crend()
Operacije iteratora
Baš kao što je pokazivač aritmetika, postoje neke operacije koje su dopuštene na iteratorima C ++. Oni se koriste za pružanje različitih funkcionalnosti koje povećavaju važnost iteratora. Ima 5 valjanih Operacije iteratora u C ++ ::
- Dereferenciranje iteratora
- Povećanje/smanjenje iteratora
- Dodavanje/oduzimanje cijelog broja iteratorima
- Oduzimanje drugog iteratora
- Usporedba iteratora
Dereferenciranje iteratora
Operacija dereferencije omogućuje korisnicima pristup ili ažuriranje Vrijednost elementa ukazana na iterator. Koristimo (*) indirektni operater Da biste dereferencirali iteratore baš kao i pokazivači.
C++// Access *it; // Update *it = new_val;
gdje new_val Je li nova vrijednost dodijeljena elementu koji je ukazao iterator to .
Povećanje/smanjenje iteratora
Možemo povećati ili smanjiti iterator za 1 koristeći (++) ili (-) operateri odnosno. Operacija priraštaja premješta iterator na sljedeći element u spremniku, dok operacija smanjenja premješta iterator na prethodni element.
C++it++; // post-increment ++it; // pre-increment it--; // post-decrement --it; // pre-decrement
Dodavanje/oduzimanje cijelog broja iteratorima
Također možemo dodati ili oduzeti cijelu vrijednost od iteratora. To će više iterator sljedeći ili prethodni položaj prema dodanoj cijeloj vrijednosti.
C++// Addition it + int_val; // Subtraction it - int_val;
gdje int_val je li cijele vrijednosti koje se dodaju ili oduzimaju od iteratora to .
Oduzimanje drugog iteratora
Možemo oduzeti jedan iterator od drugog kako bismo pronašli udaljenost (ili broj elemenata) između memorije na koju ukazuju.
C++it1 - it2
Usporedba iteratora
Također možemo testirati dva iteratora iste vrste jedni protiv drugih kako bismo pronašli odnos između njih. Možemo koristiti relacijske operatore poput (==) jednakosti i (! =) Operatori nejednakosti zajedno s drugim relacijskim operatorima poput< > <= >=.
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 iteratora u C ++
STL iteratori se mogu podijeliti na temelju operacija koje se na njima mogu izvesti. U C ++ postoji 5 glavnih vrsta iteratora koji su navedeni u donjoj tablici, zajedno s podržanim kontejnerima i podržanim operacijama iteratora.
Iterator | Opis | Podržani spremnici | Podržane operacije |
|---|---|---|---|
Ulazni iterator | To je jednosmjerni iterator koji se koristi za čitanje vrijednosti. | Ulazni tok | Dereferenciranje jednakost povećanja |
Izlazni iterator | Također je jednosmjerni iterator, ali koristi se za dodjelu vrijednosti. Ne može pristupiti vrijednostima. | Izlazni tok | Dereferenciranje (samo napišite) priraštaj |
Iteratori naprijed | Može pristupiti i dodijeliti vrijednosti. To je kombinacija i ulaznog i izlaznog iteratora. | FORTHER_LIST UNREMEDED_MAP UNERDEDED_SET | Dereferenciranje jednakost povećanja |
Dvosmjerni iteratori | Može se kretati u oba smjera ili prema naprijed ili natrag. Kontejneri poput seta popisa i multimap podržavaju dvosmjerne iteratore. | Postavite kartu set multimap multiset | Dereferencing Povećanje/jednakost smanjenja |
Iteratori nasumičnog pristupa | Iteratori nasumičnog pristupa su iteratori koji se mogu koristiti za pristup elementima na udaljenosti od elementa koji ukazuju na nudeći istu funkcionalnost kao i pokazivači. | vektorski niz deque niza pogreška: nije moguće pronaći ili učitati glavnu klasu | Sve |
Kao što smo možda primijetili iz gornje tablice, osim ulaznih i izlaznih iteratora Dok se spuštamo niz tablicu, tip Iterator sadrži značajke iznad iteratora, zajedno s nekim novim značajkama.
Adapteri iteratora
Adapteri iteratora u C ++ su posebna vrsta iteratora koji su izgrađeni preko tradicionalnih iteratora za pružanje specijalizirane funkcionalnosti. U C ++ su mnogi adapteri iteratora, od kojih su neki dani u nastavku:
Iterator adapteri tip | Opis |
|---|---|
Obrnuti iterator | Obrnuti iterator izgrađen je preko dvosmjernog ili iznad vrste operatora i omogućuje korisnicima da prelaze spremnik u obrnutom smjeru. |
Iteratori struje | Iteratori struje, naime Istream i ostream iteratori, izgrađeni su na ulaznim i izlaznim iteratorima. Ovi iteratori omogućuju korisnicima da koriste tokove kao kontejnere. |
Pomaknite iteratore | Move Iteratori se koriste za uvođenje semantike Move u STL algoritmima. Iteratori poteza premještaju vlasništvo nad podacima o kopiranim spremnicima u spremniku za kopiranje bez stvaranja dodatnih primjeraka. |
Iterator umetnika | Iteratori umetnika omogućuju vam umetanje danih elemenata u nekom položaju u spremnik. U C ++ postoje tri iteratora umetnika:
Ovi se iteratori mogu stvoriti pomoću back_inserter () front_inserter () umetnuti() Funkcije u C ++. |
Utility iterator funkcionira u C ++
C ++ STL pružaju različite funkcije za pojednostavljenje rada s iteratorima. Navedeni su u donjoj tablici:
| Funkcija | Opis | Sintaksa |
|---|---|---|
| STD :: Napred | Napreduje iterator određenim brojem pozicija. | unaprijed ( to n ) |
| std :: sljedeće | Vraća iterator koji je određeni broj pozicija ispred danog iteratora. | sljedeći ( to n ) |
| Std :: | Vraća iterator koji je određeni broj položaja iza danog iteratora. | prev ( to n ) |
| STD :: Udaljenost | Vraća broj elemenata između dva iteratora. | udaljenost ( IT1 IT2 ) |
| STD :: Početak | Vraća iterator u prvi element zadanog spremnika. | početi ( spremnik ) |
| std :: kraj | Vraća iterator u element nakon posljednjeg elementa datog spremnika. | kraj ( spremnik ) |
| std :: rbegin | Vraća obrnuti iterator u posljednji element zadanog spremnika. | begin ( spremnik ) |
| std :: rend | Vraća obrnuti iterator u element koji je prethodio prvom elementu danog spremnika. | stvarati ( spremnik ) |
| STD :: Umetanje | Stvara iterator za umetanje koji ubacuje elemente u spremnik na određenom položaju. | umetak ( položaj spremnika ) |
| std :: back_inserter | Stvara iterator za umetanje leđa koji dodaje elemente na kraju spremnika. | back_inserter ( spremnik ) |
| std :: front_inserter | Stvara prednji iterator za umetanje koji ubacuje elemente na prednjem dijelu spremnika. | front_inserter ( spremnik ) |
Primjene iteratora s primjerima
Iteratori se široko koriste u C ++ u više različitih svrha dok rade sa STL spremnicima i algoritmima. Slijede neke primarne primjene iteratora u C ++ koje primjeri njihovog koda:
Prelaska kontejnera
Prelazak STL spremnika najosnovnija je primjena iteratora. U ovome koristimo funkcije početne () i end () kako bismo dobili početak i kraj iteratora da pređu cijeli spremnik. U osnovi nastavljamo povećavati početni iterator dok nije jednak kraju.
Primjer
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; }
Izlaz
10 20 30 40 50
Kao što je prikazano u gornjem kodu, prelazimo postavljeni spremnik. Slično tome, možemo koristiti isti pristup za prelazak bilo kojeg spremnika.
Preokret spremnika
Obrnuti iteratori omogućuju vam da pređete spremnik od kraja na početak bez potrebe za ručnim rukovanjem preokretom.
Primjer
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; }
Izlaz
50 40 30 20 10
Algoritmi neovisni
Iteratori omogućuju algoritmi da rade s bilo kojom funkcijom izrade tipa spremnika poput std :: sort () std :: find () i std :: for_each () fleksibilniji. Možete proći iteratore umjesto stvarnog spremnika.
Primjer
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; }
Izlaz
10s in Vector: 2 10s in Multiset: 3
Dodatne primjene iteratora
Postoji više primjena STL iteratora:
- Izračun udaljenosti: Korištenje STD :: udaljenost () Iteratori pomažu izračunavanju broja elemenata između dva položaja u spremniku.
- Iteracija struje: Iteratori struje omogućuju vam tretiranje ulaznih/izlaznih tokova poput spremnika što olakšava čitanje i pišete u struje pomoću STL algoritama.
- Pomicanje semantike u STL algoritmima: Move Iterators Uvodi semantiku poteza u STL algoritmima koji pomažu u povećanju performansi i učinkovitosti izbjegavanjem nepotrebnog kopiranja. Podaci će biti premješteni prema pravilima semantike Move.
- Prilagođeni iteratori za strukture podataka: Prilagođeni iteratori mogu se implementirati za ne-STL strukture podataka poput stabala ili grafikona kako bi se pružila podrška za STL algoritme i mnoge druge značajke. Možda ćemo trebati slijediti nekoliko skupa pravila i konvencija kako bismo osigurali pravilno povećanje smanjenja i druge operacije.