C++ vektoru iteratori

C Vektoru Iteratori



Galvenie C++ iteratori ir ievades iterators, izvades iterators, pārsūtīšanas iterators, divvirzienu iterators un brīvpiekļuves iterators. Reverse Iterator patiesībā nav iterators; tas ir iteratora adapteris. Ir daži iteratoru varianti, piemēram, pastāvīgs iterators.

Iterators ir izstrādāts rādītājs. Tāpat kā rādītājs, tas norāda uz viena veida objektiem atmiņā dažādos laikos. No visiem iteratoriem var noņemt atsauces, izņemot izvades iteratoru, kas ir atdalāms tikai noteiktu tipu kopai. Atsauce nozīmē, ka vērtību, uz kuru norāda rādītājs vai iterators, var iegūt, izmantojot novirzīšanas operatoru *. Veselu skaitli dažiem iteratoriem var pievienot tādā pašā veidā, un tam pašam mērķim vesels skaitlis tiks pievienots rādītājam.

Šī raksta jautājumi ir šādi: Kas ir šie iteratori? Kuri no šiem iteratoriem tiek izmantoti ar C++ vektoru? Kā šie iteratori tiek izmantoti ar C++ vektoru? Šis raksts sniedz atbildes uz visiem šiem jautājumiem vienkāršotā veidā. Šī raksta beigās, kad visi šie jautājumi būs atbildēti, C++ vektoru iteratori būs intuitīvi un dabiski (lasītājam).







Raksta saturs

C++ iteratoru kopsavilkums

Ievades iterators



Ievades iteratora ideja ir tāda, lai programma saņemtu ievades vērtību. Atšķirībā no izvades iteratora, ievades iteratoram vienmēr var būt atsauces. Diviem ievades iteratoriem, a un b, “a == b” nenozīmē “++a == ++b”.



Izvades iterators
Izvades iteratora ideja ir programmai atbrīvot izvades vērtību. Atšķirībā no ievades iteratora, izvades iteratoru ne vienmēr var atsaukt. Tas ir atceļams tikai noteiktu veidu kopai.





Pārsūtīt iteratoru
Priekšējais iterators var skenēt vektoru no sākuma līdz beigām, pa vienam (palielinot). Tam ir visas ievades iteratora prasības, kā arī papildu prasības. Tas var aizstāt ievades iteratoru. Diviem tiešajiem iteratoriem, a un b, “a == b” nozīmē “++a == ++b”.

Divvirzienu iterators
Divvirzienu iterators var skenēt vektoru no sākuma līdz beigām, pa vienam. No beigām līdz sākumam pa vienam (samazinot). Tam ir visas pārsūtīšanas iteratora prasības, kā arī papildu prasības. Tas var aizstāt pārsūtīšanas iteratoru. Diviem divvirzienu iteratoriem a un b,



“a == b” nozīmē “++a == ++b”
un
“–a == –b” nozīmē “a == b”.

Brīvpiekļuves iterators

Brīvpiekļuves iteratoram ir visas divvirzienu iteratora prasības, kā arī papildu prasības. Tas var aizstāt divvirzienu iteratoru. Brīvpiekļuves iteratoram ir tāda priekšrocība, ka, ja tas pašlaik norāda uz pirmo elementu un ir nepieciešams ceturtais elements, tas izlaiž otro un trešo elementu un norāda uz ceturto elementu. Apgrieztā izlaišana uz leju ir patiesa.

Reversais iterators

Ņemiet vērā, ka C++ nav parastā reversā iteratora, jo tam ir priekšējais iterators. Tātad ir adapteris, ko sauc par reverso iteratoru. Ir arī citas labas ziņas: reversais iterators atbilst visām divvirzienu iteratora prasībām.

Pastāvīgs iterators

Ja iterators tiek uzskatīts par const iteratoru, elementu, uz kuru tas norāda, nevar modificēt.

Vektoru konstrukcija un piekļuve

C++ konteineri ir: klases masīvs, deque, forward_list, saraksts, vektors, karte, kopa, unordered_map un unordered_set. Vektors ir konteiners. Dažas funkciju veidnes C++ standarta bibliotēkā tieši vai netieši darbojas ar iteratoriem. C++ konteineri, kā arī vektors izmanto šīs funkcijas. Šīs funkcijas var padarīt pieejamas C++ programmai ar kādu no šīm iekļaušanas direktīvām:

#include

vai

#iekļaut

Iekļaujot jebkuru citu konteineru, arī šīs funkciju veidnes būs pieejamas. Funkciju veidne ir paredzēta funkcijai, kas var darboties ar dažādiem datu tipiem. Vektors izmanto iteratorus, izmantojot šīs funkciju veidnes. Dažas funkciju veidnes un to attiecības ar vektoru ir šādas:

Būvniecība

Veidnes funkcija:

veidne < klasē C > constexpr auto datus ( C & c ) - > dekltips ( c. datus ( ) ) ;

auto nozīmē, ka atgriešanās veids tiek noteikts funkcijas novērtēšanā. c ir C klases objekts.

Ar to netieši konstruēta vektora objekta piemērs ir:

vektors < char > vtr ;

Šeit objekts c ir tukšs.

Veidnes funkcija:

veidne < klasē UN > constexpr konst UN * datus ( inicializētāja_saraksts < UN > The ) nē izņemot ;

Šeit E* ir iterators, kas norāda uz saraksta vai konteinera pirmo elementu. Tās izmantošana ar vektoru netieši būtu ar:

vektors < char > vtr { 'A' , 'B' , 'C' , 'D' , 'UN' } ;
vektors < char > :: const_iterator to = vtr. sākt ( ) ;

Veidnes funkcija ir vairāk piemērojama sākuma () paziņojumam (otrajam apgalvojumam).

Piekļuve

Veidnes funkcija:

veidne < klasē C > constexpr auto Izmērs ( konst C & c ) - > dekltips ( c. Izmērs ( ) ) ;

Tas atgriež konteinera izmēru. Vektora piemērs:

vektors < char > vtr { 'A' , 'B' , 'C' , 'D' , 'UN' } ;
starpt N = vtr. Izmērs ( ) ;
cout << N << endl ;

Izvade ir 5.

Veidnes funkcija:

veidne < klasē UN > [ [ nodiscard ] ] constexpr bool tukšs ( inicializētāja_saraksts < UN > The ) nē izņemot ;

Atgriež vērtību True, ja saraksts ir tukšs vai nepatiess citādi. Vektora piemērs:

vektors < char > vtr { 'A' , 'B' , 'C' , 'D' , 'UN' } ;
bool ar = vtr. tukšs ( ) ;
cout << ar << endl ;

Izvade ir 0 nepatiesai.

Diapazona piekļuve

Ir arī citas veidņu funkcijas, kas izmanto iteratorus, ko vektors izmanto savām diapazona problēmām. Diapazons ir secīga konteinera elementu kopa.

Veidnes funkcija:

veidne < klasē C > constexpr auto sākt ( C & c ) - > dekltips ( c. sākt ( ) ) ;

Tas atgriež iteratoru, kas norāda uz pirmo elementu sarakstā. auto šeit nozīmē, ka atgriešanās vērtība tiek noteikta novērtēšanas laikā. Piemērs vektoram:

vektors < char > vtr { 'A' , 'B' , 'C' , 'D' , 'UN' } ;
vektors < char > :: iterators to = vtr. sākt ( ) ;
cout << * to << ' \n ' ;

Izvade ir A. Šeit atgrieztais iterators ir brīvpiekļuves iterators. Varēja atgriezt pastāvīgu brīvpiekļuves iteratoru — skatiet vēlāk.

Funkciju veidne:

veidne < klasē C > constexpr auto beigas ( konst C & c ) - > dekltips ( c. beigas ( ) ) ;

Atgriež konstantu iteratoru, kas norāda uz pēdējo saraksta elementu. Vektora kods:

vektors < char > vtr { 'A' , 'B' , 'C' , 'D' , 'UN' } ;
vektors < char > :: const_iterator to = vtr. beigas ( ) ;
-- to ;
cout << * to << '' ;
-- to ;
cout << * to << endl ;

Izvade ir “E D”. Pastāvīgo iteratoru var palielināt vai samazināt, bet vērtību, uz kuru tas norāda, nevar mainīt. Varēja atgriezt parasto brīvpiekļuves iteratoru — skatiet vēlāk.

Funkciju veidne:

veidne < klasē UN > constexpr reverse_iterator < konst UN * > rbegin ( inicializētāja_saraksts < UN > The ) ;

Atgriež pēdējo vērtību sarakstā. rbegin() norāda uz pēdējo saraksta elementu, nevis tālāk par pēdējo saraksta elementu, tāpat kā end(). Vektora piemērs:

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

Izvade ir: E D. Izmantojot apgriezto iteratoru, ++ ir pretējs efekts divvirzienu iteratoram.

Funkciju veidne:

veidne < klasē UN > constexpr reverse_iterator < konst UN * > padara ( inicializētāja_saraksts < UN > The ) ;

Punkti tieši pirms saraksta pirmā elementa. Vektora piemērs:

vektors < char > vtr { 'A' , 'B' , 'C' , 'D' , 'UN' } ;
vektors < char > :: reverse_iterator to = vtr. padara ( ) ;
-- to ;
cout << * to << '' ;
-- to ;
cout << * to << endl ;

Izvade ir A B. Ar apgriezto iteratoru — ir pretējs efekts ++ divvirzienu iteratoram.

Zem šī virsraksta ir arī citas veidņu funkcijas — skatiet vēlāk.

Ievietojiet iteratorus

reverse_iterator ir iteratora adapteris, nevis iterators. Ievietošanas iterators ir arī iteratora adapteris. Tas atbilst visām izvades iteratora prasībām, kā arī savām prasībām. Programmā C++ tas pastāv trīs formās: back_inserter, front_inserter un inserter. Katram no tiem ir savs konstruktors.

back_inserter:

Aizmugurē ieliktņi!
Svarīgi prototipi:

nepārprotami back_insert_iterator ( Konteiners & x ) ;
back_insert_iterator & operators = ( tipa nosaukums Konteiners :: vērtības_veids && vērtību ) ;

Vektora piemērs:
Vektoram nav nevienas ievietošanas elementa funkcijas, kas tiek ievietotas aizmugurē. Tomēr push_back(t) dalībnieka funkciju var redzēt šādi.

front_inserter

Ieliktņi priekšpusē!
Svarīgi prototipi:

nepārprotami front_insert_iterator ( Konteiners & x ) ;
front_insert_iterator & operators = ( tipa nosaukums Konteiners :: vērtības_veids && vērtību ) ;

Vektora piemērs:
Vektoram nav nevienas ievietošanas elementa funkcijas, kas ievieto priekšpusē. Vektoram nav arī locekļa funkcijas push_front(t).

Labā ziņa ir tā, ka vektoram ir ievietošanas elementa funkcijas, kuras var ievietot jebkurā vietā, vektora sākumā, iekšpusē vai beigās.

ievietotājs

Šis iterators ievietos vektora sākumā, iekšpusē vai beigās.

Svarīgi prototipi:

insert_iterator ( Konteiners & x, tipa nosaukums Konteiners :: iterators i ) ;
insert_iterator & operators = ( tipa nosaukums Konteiners :: vērtības_veids && vērtību ) ;

Vektora piemērs:

vektors < char > vtr { 'A' , 'B' , 'C' , 'D' , 'UN' } ;
vektors < char > :: iterators to = vtr. sākt ( ) ;
to = to + 2 ;
vtr. ievietot ( tas, 'c' ) ;

priekš ( starpt i = 0 ; i < vtr. Izmērs ( ) ; i ++ )
cout << vtr [ i ] << ',' ;
cout << endl ;

Izvade ir:

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

Vektora ievietošanas izteiksme ir:

vtr. ievietot ( tas, 'c' ) ;

Tas ievieto elementu tieši pirms rādītāja (tā), uz kuru tas norāda.

Pārvietot iteratoru

Move_iterator ir arī iteratora adapteris. Šī programma ir līdzīga piemēram, kas ir C++ specifikācijā:

#include
#include
#iekļaut
izmantojot nosaukumvieta std ;

starpt galvenais ( )
{
sarakstu < char > chs { 'A' , 'B' , 'C' , 'D' , 'UN' } ;
vektors < char > vtr ( make_move_iterator ( chs. sākt ( ) ) , make_move_iterator ( chs. beigas ( ) ) ) ;

cout << 'Sākotnējā saraksta saturs:' << endl ;
priekš ( auto to = chs. sākt ( ) ; to ! = chs. beigas ( ) ; to ++ )
cout << * to << ',' ;
cout << endl << endl ;

cout << 'Vektoru saturs:' << endl ;
priekš ( starpt i = 0 ; i < vtr. Izmērs ( ) ; i ++ )
cout << vtr [ i ] << ',' ;
cout << endl ;

atgriezties 0 ;
}

Izvade ir:

Sākotnējā saraksta saturs:
A, B, C, D, E,

Vektora saturs:
A, B, C, D, E,

Šis iterators pārvērš avota vērtību par rvērtību, pirms to ievieto galamērķī.

Secinājums

Galvenie C++ iteratori ir ievades iterators, izvades iterators, pārsūtīšanas iterators, divvirzienu iterators un nejaušās piekļuves iterators. C++ standarta bibliotēkā ir dažas funkciju veidnes, kas izmanto šos iteratorus. Vektors izmanto šos iteratorus, izmantojot funkciju veidnes. Dažiem no šiem iteratoriem vektoram ir dažādi nosaukumi. Ir arī iteratora adapteri, kas ir: reverse_iterator, iterator adapteris un move_iterator. Pastāv arī daži iteratoru varianti. Pietiek iekļaut programmā, lai būtu visas šīs funkcijas. Izprotot šo iteratoru, adapteru un funkciju veidņu lomu, kas tos izmanto, iteratoru izmantošana ar vektoriem kļūst intuitīva.