An iteratorius C ++ yra į rodyklę panašus objektas, nukreipiantis į STL konteinerio elementą. Paprastai jie naudojami per STL konteinerio turinį C ++. Pagrindinis STL iteratorių pranašumas yra tas, kad jie daro STL algoritmus nepriklausomai nuo naudojamo konteinerio tipo. Mes galime tiesiog perduoti iteratorių į konteinerio elementus, o ne patį konteinerį į STL algoritmus.
Iteratoriaus deklaracija
Kiekvienas konteineris C ++ STL turi savo iteratorių. Taigi mes turime paskelbti iteratorių kaip:
C++
<type>::iterator it;
Kur
- tipas: Konteinerio tipas, kuriam deklaruojamas iteratorius.
- tai: Vardas, priskirtas „Iterator“ objektui.
Tada galime jį inicijuoti priskirdami galiojantį iteratorių. Jei jau turime iteratorių, kuris bus priskirtas delcaracijos metu automatinis Raktinis žodis.
C++auto it = iter
Kur iter Ar iteratorius, priskirtas naujai sukurtam IT iTeratoriui.
Mūsų C ++ kursas Apima Iteratorių naudojimą STL, užtikrinant, kad suprantate, kaip pereiti įvairius konteinerių tipus.
Iteratorių pavyzdys
Žemiau esanti programa iliustruoja, kaip naudoti iteratorių, norint apeiti vektoriaus konteinerį:
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; }
Išvestis
1 2 3 4 5
Kaip galbūt pastebėjote, mes naudojome vektorius :: Pradėti () ir vektorius :: pabaiga () funkcija. Šios funkcijos yra „STD :: Vector“ elemento funkcijos, kurios grąžina iteratorių į pirmąjį ir vieną elementą po paskutinio vektoriaus elemento. Mes naudojame iteratorių grąžą, kad būčiau šios funkcijos, kad pakartotumėte vektorius.
Konteinerio iteratoriaus funkcijos
C ++ STL teikia kai kurias narių funkcijas STL konteineris kurie grąžina iteratorius bent į pirmąjį ir paskutinį elementą. Šios narių funkcijos yra apibrėžtos beveik visame STL talpykloje (paliekant keletą ribotų prieigos konteinerių, pavyzdžiui, krūva eilutė ) su tuo pačiu nuoseklumo pavadinimu.
Šioje lentelėje pateikiami visi metodai, kurie grąžina iteratorių į konteinerius:
Iteratoriaus funkcija | Grąžinimo vertė |
|---|---|
pradėti () | Grąžina iteratorių į konteinerio pradžią. |
pabaiga () | Grąžina iteratorių prie teorinio elemento iškart po paskutinio konteinerio elemento. |
cbegin () | Grąžina nuolatinį iteratorių į konteinerio pradžią. Pastovus iteratorius negali modifikuoti elemento, į kurį jis nurodo, vertę. |
keli () pabraukti naudojant css | Grąžina nuolatinį iteratorių prie teorinio elemento iškart po paskutinio konteinerio elemento. |
rbegin () | Grąžina atvirkštinį iteratorių į konteinerio pradžią. |
Render () | Grąžina atvirkštinį iteratorių prie teorinio elemento iškart po paskutinio konteinerio elemento. |
crbegin () | Grąžina nuolatinį atvirkštinį iteratorių į konteinerio pradžią. |
Crend () | Grąžina nuolatinį atvirkštinį iteratorių prie teorinio elemento iškart po paskutinio konteinerio elemento. |
Pavyzdžiui, jei dalykas yra vektoriaus pavadinimas, tada mes galime naudoti aukščiau pateiktus metodus, kaip parodyta žemiau:
C++vec.begin() vec.rbegin() vec.cbegin() vec.crbegin() vec.end() vec.rend() vec.cend() vec.crend()
Iteratorių operacijos
Kaip ir rodyklės aritmetika, yra keletas operacijų, kurios leidžiamos C ++ iteratoriuose. Jie naudojami teikiant skirtingas funkcijas, kurios padidina iteratorių svarbą. Yra 5 galiojantys iteratoriaus operacijos C ++ :
- Iteratorių panaikinimas
- Papildymas/mažinimas iteratoriai
- Sveikojo skaičiaus pridėjimas/atimimas prie pakartojimų
- Atimti kitą iteratorių
- Palyginus iteratorius
Iteratorių panaikinimas
Nenusivertinimo operacija leidžia vartotojams Prieiga arba atnaujinimas Iteratoriaus nurodytos elemento vertė. Mes naudojame (*) Indirekcijos operatorius Norėdami panaikinti iteratorius, kaip ir rodyklės.
C++// Access *it; // Update *it = new_val;
Kur new_val yra naujoji vertė, priskirta elementui, kurį nurodo iteratorius Tai .
Papildymas/mažinimas iteratoriai
Mes galime padidinti ar sumažinti iteratorių 1, naudodami (++) arba (-) operatoriai atitinkamai. Padidėjimo operacija perkelia iteratorių į kitą konteinerio elementą, o sumažinimo operacija perkelia iteratorių į ankstesnį elementą.
C++it++; // post-increment ++it; // pre-increment it--; // post-decrement --it; // pre-decrement
Sveikojo skaičiaus pridėjimas/atimimas prie pakartojimų
Taip pat galime pridėti ar atimti sveiką vertę iš iteratorių. Tai labiau pakartoja kitą ar ankstesnę poziciją pagal pridėtinę sveiką skaičių vertę.
C++// Addition it + int_val; // Subtraction it - int_val;
Kur int_val yra sveiko skaičiaus vertės, kurios pridedamos arba atimamos iš iteratoriaus Tai .
Atimti kitą iteratorių
Mes galime atimti vieną iteratorių iš kito, kad rastume atstumą (arba elementų skaičių) tarp atminties, į kurią jie nurodo.
C++it1 - it2
Palyginus iteratorius
Mes taip pat galime išbandyti du to paties tipo iteratorius vienas prieš kitą, kad surastume ryšį tarp jų. Mes galime naudoti reliacinius operatorius, tokius kaip (==) lygybė ir (! =) Nelygybės operatoriai kartu su kitais reliaciniais operatoriais, tokiais kaip< > <= >=.
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
Iteratorių tipai C ++
STL iteratoriai gali būti padalyti remiantis operacijomis, kurias galima atlikti ant jų. „C ++“ yra 5 pagrindiniai iteratorių tipai, kurie išvardyti žemiau esančioje lentelėje kartu su palaikomais konteineriais ir palaikomomis iteratoriaus operacijomis.
Iteratorius | Aprašymas | Palaikomi konteineriai | Palaikomos operacijos |
|---|---|---|---|
Įvesties iteratorius | Tai yra vienpusis iteratorius, naudojamas vertėms skaityti. | Įvesties srautas | Papildymo lygybė |
Išvesties iteratorius | Tai taip pat yra vienpusis iteratorius, tačiau naudojamas vertėms priskirti. Tai negali pasiekti reikšmių. | Išvesties srautas | Panaikinimo (tik rašymo) padidėjimas |
Persiųsti iteratorius | Jis gali pasiekti ir priskirti reikšmes. Tai yra tiek įvesties, tiek išvesties iteratoriaus derinys. | „Forward_List Unordered_map Unordered_set“ | Papildymo lygybė |
Dvikrypčiai iteratoriai | Jis gali judėti tiek į priekį, tiek atgal. Konteineriai, tokie kaip sąrašo rinkinys ir „MultiMap“, palaiko dvikrypčius iteratorius. | Sąrašo žemėlapio rinkinys „MultiMap Multiset“ | Papildymo padidėjimo/sumažėjimo lygybė |
Atsitiktinės prieigos iteratoriai | Atsitiktinės prieigos iteratoriai yra iteratoriai, kurie gali būti naudojami norint pasiekti elementus atstumu nuo elemento, kurį jie nurodo siūlyti tą pačią funkciją kaip ir rodyklės. | vektoriaus deque masyvo eilutė programinės įrangos testavimas ir tipai | Viskas |
Kaip mes galbūt pastebėjome iš aukščiau pateiktos lentelės, išskyrus įvesties ir išvesties iteratorius Eidami žemyn lentele, iteratoriaus tipas turi aukščiau iteratoriaus funkcijas kartu su keliomis naujomis funkcijomis.
Iteratoriaus adapteriai
Iteratoriaus adapteriai C ++ yra specialus iteratorių tipas, pastatytas virš tradicinių iteratorių, kad būtų užtikrintas specializuotas funkcionalumas. „C ++“ yra daug iteratorių adapterių, kurių kai kurie pateikiami žemiau:
Iteratoriaus adapterių tipas | Aprašymas |
|---|---|
Atvirkštinis iteratorius | Atvirkštinis iteratorius yra pastatytas per dvikryptį arba aukštesnį operatoriaus tipą ir leidžia vartotojams pervažiuoti konteinerį atvirkštine kryptimi. |
Srauto iteratoriai | Srauto iteratoriai, būtent „IStream“ ir „Ostream“ iteratoriai, yra sukurti atitinkamai ant įvesties ir išvesties iteratorių. Šie iteratoriai leidžia vartotojams naudoti srautus kaip konteinerius. |
Judėti iteratoriai | Judėjimo iteratoriai naudojami STL algoritmų judėjimo semantikai įvesti. Judėjimo iteratoriai perkelia nukopijuotų konteinerių duomenų nuosavybę į kopijavimo konteinerį, nesukurdami papildomų kopijų. |
Įtraukimo iteratorius | „Insertor“ iteratoriai leidžia įterpti nurodytus elementus į tam tikrą konteinerio vietą. „C ++“ yra trys „Insertor“ iteratoriai:
Šiuos iteratorius galima sukurti naudojant back_inserter () front_inserter () intarpas () Funkcijos C ++. |
Iteratoriaus naudingumo funkcijos C ++
„C ++ STL“ pateikia įvairias funkcijas, kaip supaprastinti darbą su iteratoriais. Jie išvardyti žemiau esančioje lentelėje:
| Funkcija | Aprašymas | Sintaksė |
|---|---|---|
| STD :: Išankstinis | Pažangina iteratorių pagal tam tikrą skaičių pozicijų. | išankstinis ( tai n ) |
| STD :: Kitas | Grąžina iteratorių, kuris yra nurodytas pozicijų skaičius prieš duotą iteratorių. | Kitas ( tai n ) |
| Std :: Ankstesnis | Grąžina iteratorių, kuris yra nurodytas vietų skaičius už duoto iteratoriaus. | Ankstesnis ( tai n ) |
| STD :: Atstumas | Grąžina elementų skaičių tarp dviejų iteratorių. | atstumas ( it1 it2 ) |
| std :: pradėti | Grąžina iteratorių į pirmąjį duoto konteinerio elementą. | pradėti ( konteineris ) |
| std :: pabaiga | Grąžina iteratorių į elementą, laikantis paskutinio duoto konteinerio elemento. | pabaiga ( konteineris ) |
| std :: rbegin | Grąžina atvirkštinį iteratorių į paskutinį duoto konteinerio elementą. | Rbeginas ( konteineris ) |
| std :: rend | Grąžina atvirkštinį iteratorių į elementą prieš pirmąjį duoto konteinerio elementą. | gamina ( konteineris ) |
| STD :: Inserter | Sukuria įdėklo iteratorių, kuris įterpia elementus į konteinerį nurodytoje padėtyje. | inserteris ( konteinerio padėtis ) |
| std :: back_inserter | Sukuria užpakalinio įterpimo iteratorių, kuris prideda elementus prie konteinerio galo. | „Back_Inserter“ ( konteineris ) |
| std :: front_inserter | Sukuria priekinio įdėklo iteratorių, kuris įterpia elementus konteinerio priekyje. | front_inserter ( konteineris ) |
Iteratorių programos su pavyzdžiais
Iteratoriai yra plačiai naudojami C ++ daugeliui skirtingų tikslų dirbant su STL konteineriais ir algoritmais. Toliau pateikiami kai kurie pagrindiniai iteratorių pritaikymai C ++, kurie yra jų kodo pavyzdžiai:
Kelionės konteineriai
STL konteineriai yra patys pagrindiniai iteratorių taikymas. Tuo metu mes naudojame pradžios () ir pabaigos () funkcijas, kad pradėtume ir baigtume iteratorius, kad apvažiuotume visą indą. Iš esmės mes palaikome pradžios iteratorių, kol jis nebus lygus galui.
Pavyzdys
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; }
Išvestis
10 20 30 40 50
Kaip parodyta aukščiau esančiame kode, mes einame nustatytą konteinerį. Panašiai mes galime naudoti tą patį požiūrį, kad apvažiuotume bet kurį konteinerį.
Atliekant talpyklą
Atvirkštiniai iteratoriai leidžia pervažiuoti indą nuo galo iki pradžios, nereikia rankiniu būdu tvarkyti atvirkštinio.
Pavyzdys
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; }
Išvestis
50 40 30 20 10
Nuo konteinerių nepriklausomi algoritmai
Iteratoriai leidžia algoritmams dirbti su bet kokiu konteinerio tipo gamybos funkcijomis, tokiomis kaip STD :: SOR () std :: Find () ir std :: for_each () lankstesnės. Vietoj tikrojo konteinerio galite perduoti iteratorius.
Pavyzdys
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; }
Išvestis
10s in Vector: 2 10s in Multiset: 3
Papildomos pakartojimų taikymo
Yra daugiau STL iteratorių programų:
- Atstumo skaičiavimas: Naudojant std :: Distance () iteratoriai padeda apskaičiuoti elementų skaičių tarp dviejų padėčių talpykloje.
- Srauto iteracija: Srauto iteratoriai leidžia gydyti įvesties/išvesties srautus, pavyzdžiui, konteinerius, todėl jį lengviau skaityti ir rašyti į srautus naudojant STL algoritmus.
- Perkelkite semantiką STL algoritmuose: Judėjimo iteratoriai pristato STL algoritmų judėjimo semantiką, kuri padeda padidinti našumą ir efektyvumą, vengiant nereikalingo kopijavimo. Duomenys bus perkelti pagal judėjimo semantikos taisykles.
- Individualūs duomenų struktūrų iteratoriai: Individualizuoti iteratoriai gali būti įdiegti ne STL duomenų struktūroms, tokioms kaip medžiai ar grafikai, kad būtų palaikoma STL algoritmams ir daugeliui kitų funkcijų. Mums gali tekti laikytis kelių taisyklių ir konvencijų rinkinio, kad būtų galima tinkamai padidinti mažinimą ir kitas operacijas.