C++ vektorite iteraatorid

C Vektorite Iteraatorid



C++ peamised iteraatorid on sisendiiteraator, väljunditeraator, edasisuunaline iteraator, kahesuunaline iteraator ja juhusliku juurdepääsu iteraator. Reverse Iterator ei ole tegelikult iteraator; see on iteraatori adapter. Iteraatoritel on mõned variandid, näiteks pidev iteraator.

Iteraator on läbitöötatud osuti. Nagu kursor, osutab see erinevatel aegadel mälus olevatele sama tüüpi objektidele. Kõik iteraatorid on viidatavad, välja arvatud väljunditeraator, mis on viidatav ainult teatud tüüpide jaoks. Refereeritav tähendab, et kursori või iteraatori poolt osutatava väärtuse saab saada kaudse operaatori * abil. Täisarvu saab mõnele iteraatorile lisada samal viisil ja samal eesmärgil lisataks täisarv osutisse.

Selle artikli küsimused on järgmised: Mis on need iteraatorid? Milliseid neist iteraatoritest kasutatakse koos C++ vektoriga? Kuidas neid iteraatoreid kasutatakse C++ vektoriga? See artikkel vastab kõigile neile küsimustele lihtsustatud viisil. Selle artikli lõpus, kui kõik need küsimused oleksid saanud vastuse, on C++ vektori iteraatorid intuitiivsed ja loomulikud (lugeja jaoks).







Artikli sisu

C++ iteraatorite kokkuvõte

Sisestusiteraator



Sisenditeraatori idee seisneb selles, et programm võtab vastu sisendväärtuse. Erinevalt väljunditeraatorist on sisendi iteraatoril alati viidata. Kahe sisendi iteraatori a ja b puhul ei tähenda 'a == b' '++a == ++b'.



Väljundi iteraator
Väljundi iteraatori idee seisneb selles, et programm vabastaks väljundväärtuse. Erinevalt sisenditeraatorist ei saa väljunditeraatorit alati viidata. See on viidatav ainult teatud tüüpide jaoks.





Edasi Iteraator
Edasi-iteraator suudab skaneerida vektorit algusest lõpuni, ükshaaval (kasvatades). Sellel on kõik sisestusiteraatori nõuded ja lisanõuded. See võib asendada sisestusiteraatori. Kahe edasisuunas iteraatori a ja b puhul tähendab 'a == b' '++a == ++b'.

Kahesuunaline iteraator
Kahesuunaline iteraator suudab ükshaaval skaneerida vektorit algusest lõpuni. Lõpust alguseni ükshaaval (dekrementeerides). Sellel on kõik edasisuunamise iteraatori nõuded ja lisanõuded. See võib asendada edasisuunamise iteraatori. Kahe kahesuunalise iteraatori a ja b korral



'a == b' tähendab '++a == ++b'
ja
“–a == –b” tähendab “a == b”.

Random Access Iterator

Random Access iteraatoril on kõik kahesuunalise iteraatori nõuded ja lisanõuded. See võib asendada kahesuunalist iteraatorit. Suvapöördusiteraatori eeliseks on see, et kui see osutab hetkel esimesele elemendile ja neljas element on vajalik, jätab see teise ja kolmanda elemendi vahele ning osutab neljandale elemendile. Vastupidine allapoole hüppamine on tõsi.

Reverse Iterator

Pange tähele, et C++-l ei ole tavalist tagurpidi iteraatorit, kuna sellel on edasi-iteraator. Niisiis, on olemas adapter, mida nimetatakse Reverse Iteratoriks. Häid uudiseid on veelgi: vastupidine iteraator vastab kõigile kahesuunalise iteraatori nõuetele.

Pidev iteraator

Kui iteraatori kohta öeldakse, et see on konst-iteraator, ei saa elementi, millele see osutab, muuta.

Vektori ehitus ja juurdepääs

C++ konteinerid on: klassi massiiv, deque, forward_list, loend, vektor, kaart, komplekt, unordered_map ja unordered_set. Vektoriks on konteiner. Teatud funktsioonimallid C++ standardteegis töötavad otse või kaudselt iteraatoritega. Neid funktsioone kasutavad nii C++ konteinerid kui ka vektor. Need funktsioonid saab teha C++ programmile kättesaadavaks ühe järgmistest kaasamisdirektiividest:

#include

või

#include

Mis tahes muu konteineri kaasamine teeb kättesaadavaks ka need funktsioonimallid. Funktsioonimall on mõeldud funktsioonide jaoks, mis võivad töötada erinevate andmetüüpidega. Vektor kasutab nende funktsioonimallide kaudu iteraatoreid. Mõned funktsioonimallid ja nende seos vektoriga on järgmised:

Ehitus

Malli funktsioon:

malli < klass C > constexpr auto andmeid ( C & c ) - > decltype ( c. andmeid ( ) ) ;

auto tähendab, et tagastustüüp määratakse funktsiooni hindamisel. c on C-klassi objekt.

Sellega kaudselt konstrueeritud vektorobjekti näide on järgmine:

vektor < char > vtr ;

Siin on objekt c tühi.

Malli funktsioon:

malli < klass JA > constexpr konst JA * andmeid ( initsialiseerija_loend < JA > The ) ei välja arvatud ;

Siin on E* iteraator, mis osutab loendi või konteineri esimesele elemendile. Selle kasutamine koos vektoriga kaudselt oleks koos:

vektor < char > vtr { 'A' , 'B' , 'C' , 'D' , 'JA' } ;
vektor < char > :: const_iterator seda = vtr. alustada ( ) ;

Malli funktsioon on rohkem rakendatav alguse () lause (teise lause) jaoks.

Juurdepääs

Malli funktsioon:

malli < klass C > constexpr auto suurus ( konst C & c ) - > decltype ( c. suurus ( ) ) ;

See tagastab konteineri suuruse. Vektori näide:

vektor < char > vtr { 'A' , 'B' , 'C' , 'D' , 'JA' } ;
int N = vtr. suurus ( ) ;
cout << N << endl ;

Väljund on 5.

Malli funktsioon:

malli < klass JA > [ [ nodiscard ] ] constexpr bool tühi ( initsialiseerija_loend < JA > The ) ei välja arvatud ;

Tagastab tõene, kui loend on tühi või väär. Vektori näide:

vektor < char > vtr { 'A' , 'B' , 'C' , 'D' , 'JA' } ;
bool koos = vtr. tühi ( ) ;
cout << koos << endl ;

Väljund on 0 vale jaoks.

Range Access

On ka teisi mallifunktsioone, mis kasutavad iteraatoreid, mida vektor kasutab oma vahemiku probleemide lahendamiseks. Vahemik on konteineri elementide järjestikune komplekt.

Malli funktsioon:

malli < klass C > constexpr auto alustada ( C & c ) - > decltype ( c. alustada ( ) ) ;

See tagastab iteraatori, mis osutab loendi esimesele elemendile. auto tähendab siin seda, et tagastatav väärtus määratakse hindamisel. Vektori näide:

vektor < char > vtr { 'A' , 'B' , 'C' , 'D' , 'JA' } ;
vektor < char > :: iteraator seda = vtr. alustada ( ) ;
cout << * seda << ' \n ' ;

Väljund on A. Siin tagastatav iteraator on juhusliku juurdepääsu iteraator. Pideva juhusliku juurdepääsu iteraatori oleks võinud tagastada – vt hiljem.

Funktsiooni mall:

malli < klass C > constexpr auto lõpp ( konst C & c ) - > decltype ( c. lõpp ( ) ) ;

Tagastab konstantse iteraatori, mis osutab loendi viimasele elemendile. Vektorkood:

vektor < char > vtr { 'A' , 'B' , 'C' , 'D' , 'JA' } ;
vektor < char > :: const_iterator seda = vtr. lõpp ( ) ;
-- seda ;
cout << * seda << '' ;
-- seda ;
cout << * seda << endl ;

Väljund on 'E D'. Konstantset iteraatorit saab suurendada või vähendada, kuid väärtust, millele see osutab, ei saa muuta. Tavalise juhusliku juurdepääsu iteraatori oleks võinud tagastada – vt hiljem.

Funktsiooni mall:

malli < klass JA > constexpr reverse_iterator < konst JA * > rbegin ( initsialiseerija_loend < JA > The ) ;

Tagastab loendi viimase väärtuse. rbegin() osutab loendi viimasele elemendile ja mitte loendi viimasest elemendist kaugemale, nagu ka end(). Vektori näide:

vektor < char > vtr { 'A' , 'B' , 'C' , 'D' , 'JA' } ;
vektor < char > :: reverse_iterator seda = vtr. rbegin ( ) ;
cout << * seda << '' ;
++ seda ;
cout << * seda << endl ;

Väljund on: E D. Pöörditeraatori korral on ++ kahesuunalise iteraatori puhul vastupidine.

Funktsiooni mall:

malli < klass JA > constexpr reverse_iterator < konst JA * > teeb ( initsialiseerija_loend < JA > The ) ;

Punktid vahetult enne loendi esimest elementi. Vektori näide:

vektor < char > vtr { 'A' , 'B' , 'C' , 'D' , 'JA' } ;
vektor < char > :: reverse_iterator seda = vtr. teeb ( ) ;
-- seda ;
cout << * seda << '' ;
-- seda ;
cout << * seda << endl ;

Väljund on A B. Pöörditeraatori puhul on — kahesuunalise iteraatori ++ puhul vastupidine efekt.

Selle pealkirja all on ka teisi mallifunktsioone – vt hiljem.

Sisesta iteraatorid

reverse_iterator on iteraatori adapter, mitte tegelikult iteraator. Sisestusiteraator on ka iteraatori adapter. See rahuldab kõik väljunditeraatori nõuded ja lisaks oma nõuded. See on C++-s kolmel kujul: back_inserter, front_inserter ja inserter. Igal neist on oma konstruktor.

back_inserter:

Tagapoolsed vahetükid!
Olulised prototüübid:

selgesõnaline back_insert_iterator ( Konteiner & x ) ;
back_insert_iterator & operaator = ( tüübinimi Konteiner :: väärtuse_tüüp && väärtus ) ;

Vektori näide:
Vektoril ei ole ühtegi tagumise osa lisamisfunktsiooni. Liikmefunktsiooni push_back(t) saab aga näha nii.

ees_sisestaja

Vahetükid ees!
Olulised prototüübid:

selgesõnaline front_insert_iterator ( Konteiner & x ) ;
front_insert_iterator & operaator = ( tüübinimi Konteiner :: väärtuse_tüüp && väärtus ) ;

Vektori näide:
Vektoril ei ole ühtegi esiosa lisamise funktsiooni. Vektoril puudub ka liigefunktsioon push_front(t).

Hea uudis on see, et vektoril on lisamisliikme funktsioonid, mis võivad sisestada ükskõik kuhu, vektori algusesse, sisse või lõppu.

sisestaja

See iteraator sisestaks vektori algusesse, sisse või lõppu.

Olulised prototüübid:

insert_iterator ( Konteiner & x, tüübinimi Konteiner :: iteraator i ) ;
insert_iterator & operaator = ( tüübinimi Konteiner :: väärtuse_tüüp && väärtus ) ;

Vektori näide:

vektor < char > vtr { 'A' , 'B' , 'C' , 'D' , 'JA' } ;
vektor < char > :: iteraator seda = vtr. alustada ( ) ;
seda = seda + 2 ;
vtr. sisestada ( see, 'c' ) ;

jaoks ( int i = 0 ; i < vtr. suurus ( ) ; i ++ )
cout << vtr [ i ] << ', ' ;
cout << endl ;

Väljund on:

A, B, c, C, D, E,

Vektori insertsiooni avaldis on:

vtr. sisestada ( see, 'c' ) ;

See lisab elemendi vahetult enne kursorit (seda), millele see osutab.

Iteraatori teisaldamine

Move_iterator on ka iteraatori adapter. Järgmine programm on sarnane C++ spetsifikatsioonis olevale näitele:

#include
#include
#include
kasutades nimeruum std ;

int peamine ( )
{
nimekirja < char > ptk { 'A' , 'B' , 'C' , 'D' , 'JA' } ;
vektor < char > vtr ( make_move_iterator ( ptk. alustada ( ) ) , make_move_iterator ( ptk. lõpp ( ) ) ) ;

cout << 'Algne loendi sisu:' << endl ;
jaoks ( auto seda = ptk. alustada ( ) ; seda ! = ptk. lõpp ( ) ; seda ++ )
cout << * seda << ', ' ;
cout << endl << endl ;

cout << 'Vektor sisu:' << endl ;
jaoks ( int i = 0 ; i < vtr. suurus ( ) ; i ++ )
cout << vtr [ i ] << ', ' ;
cout << endl ;

tagasi 0 ;
}

Väljund on:

Algne loend Sisu:
A, B, C, D, E,

Vektori sisu:
A, B, C, D, E,

See iteraator teisendab lähteväärtuse enne sihtkohta paigutamist rväärtuseks.

Järeldus

C++ peamised iteraatorid on sisendiiteraator, väljunditeraator, edasisuunaline iteraator, kahesuunaline iteraator ja juhusliku juurdepääsu iteraator. C++ standardteegis on mõned funktsioonimallid, mis neid iteraatoreid kasutavad. Vektor kasutab neid iteraatoreid funktsioonimallide kaudu. Vektoril on mõnede nende iteraatorite jaoks erinevad nimed. Samuti on iteraatori adapterid, milleks on: reverse_iterator, iterator adapter ja move_iterator. Samuti on olemas mõned iteraatorite variandid. Kõigi nende funktsioonide kasutamiseks piisab, kui lisada programmi. Pärast nende iteraatorite, adapterite ja neid kasutavate funktsioonimallide rolli mõistmist muutub iteraatorite kasutamine vektoritega intuitiivseks.