logo

Iteratoriai C ++ STL

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:

  1. back_insert_iterator: Įdėklai konteinerio gale.
  2. front_insert_iterator: Įdėklai konteinerio priekyje.
  3. insert_iterator: Įdėkite bet kurioje talpykloje.

Š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ėtiGrąžina iteratorių į pirmąjį duoto konteinerio elementą. pradėti ( konteineris )
std :: pabaigaGrąžina iteratorių į elementą, laikantis paskutinio duoto konteinerio elemento. pabaiga ( konteineris )
std :: rbeginGrąžina atvirkštinį iteratorių į paskutinį duoto konteinerio elementą. Rbeginas ( konteineris )
std :: rendGrąž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.