C++ vektorski iteratori

C Vektorski Iteratori



Glavni iteratori u C++ su ulazni iterator, izlazni iterator, naprijed iterator, dvosmjerni iterator i iterator slučajnog pristupa. Obrnuti iterator zapravo nije iterator; to je adaptor iteratora. Postoje neke varijante iteratora, poput konstantnog iteratora.

Iterator je razrađeni pokazivač. Poput pokazivača, pokazuje na objekte iste vrste u memoriji u različito vrijeme. Svi se iteratori mogu dereferencirati, osim izlaznog iteratora koji se može dereferencirati samo za skup tipova. Dereferenciranje znači da se vrijednost na koju ukazuje pokazivač ili iterator može dobiti korištenjem indirektnog operatora, *. Cijeli broj se može dodati nekim iteratorima na isti način, a za istu svrhu, cijeli broj bi se dodao pokazivaču.

Pitanja za ovaj članak su: Koji su to iteratori? Koji se od ovih iteratora koriste s C++ vektorom? Kako se ti iteratori koriste s C++ vektorom? Ovaj članak na pojednostavljen način daje odgovore na sva ta pitanja. Na kraju ovog članka, kada se na sva ova pitanja odgovori, C++ vektorski iteratori bit će intuitivni i prirodni (za čitatelja).







Sadržaj članka

Sažetak C++ iteratora

Iterator unosa



Ideja iteratora unosa je da program primi ulaznu vrijednost. Za razliku od izlaznog iteratora, ulazni iterator se uvijek može dereferencirati. Za dva ulazna iteratora, a i b, 'a == b' ne implicira '++a == ++b'.



Iterator izlaza
Ideja izlaznog iteratora je da program oslobodi izlaznu vrijednost. Za razliku od ulaznog iteratora, izlazni iterator nije uvijek dereferenciran. Može se dereferencirati samo za skup tipova.





Iterator naprijed
Iterator naprijed može skenirati vektor od početka do kraja, jedan po jedan (inkrementirajući). Ima sve zahtjeve iteratora unosa, plus dodatne zahtjeve. Može zamijeniti ulazni iterator. Za dva iteratora naprijed, a i b, 'a == b' implicira '++a == ++b'.

Dvosmjerni iterator
Dvosmjerni iterator može skenirati vektor od početka do kraja, jedan po jedan. Od kraja prema početku, jedan po jedan (dekrementiranje). Ima sve zahtjeve iteratora naprijed, plus dodatne zahtjeve. Može zamijeniti iterator naprijed. Za dva dvosmjerna iteratora, a i b,



'a == b' implicira '++a == ++b'
i
“–a == –b” implicira “a == b”.

Iterator slučajnog pristupa

Iterator slučajnog pristupa ima sve zahtjeve dvosmjernog iteratora, plus dodatne zahtjeve. Može zamijeniti dvosmjerni iterator. Iterator s nasumičnim pristupom ima prednost da ako trenutno pokazuje na prvi element, a potreban je četvrti element, preskočit će drugi i treći element i pokazati na četvrti element. Istina je obrnuto preskakanje prema dolje.

Obrnuti iterator

Imajte na umu da C++ nema normalan obrnuti iterator jer ima iterator naprijed. Dakle, postoji adapter koji se zove Reverse Iterator. Ima još dobrih vijesti: obrnuti iterator ispunjava sve zahtjeve dvosmjernog iteratora.

Konstantni iterator

Ako se za iterator kaže da je const iterator, element na koji pokazuje ne može se mijenjati.

Vektorska izgradnja i pristup

Spremnici u C++-u su: niz klasa, deque, forward_list, list, vector, map, set, unordered_map i unordered_set. Vektor je spremnik. Određeni predlošci funkcija u standardnoj biblioteci C++ rade s iteratorima izravno ili neizravno. C++ spremnici, kao i vektor, koriste ove funkcije. Ove funkcije mogu biti dostupne C++ programu bilo kojom od sljedećih direktiva uključivanja:

#include

ili

#uključi

Uključivanje bilo kojeg drugog spremnika također će učiniti dostupnim ove predloške funkcija. Predložak funkcije je za funkciju koja može raditi s različitim tipovima podataka. Vektor koristi iteratore kroz ove predloške funkcije. Neki od predložaka funkcija i njihov odnos prema vektoru su sljedeći:

Izgradnja

Funkcija predloška:

šablona < razreda C > constexpr auto podaci ( C i c ) - > decltype ( c. podaci ( ) ) ;

auto znači da je vrsta povrata određena prilikom procjene funkcije. c je objekt klase C.

Primjer vektorskog objekta konstruiranog s ovim implicitno je:

vektor < char > vtr ;

Ovdje je objekt, c, prazan.

Funkcija predloška:

šablona < razreda I > constexpr konst I * podaci ( popis_inicijalizatora < I > The ) noexcept ;

Ovdje je E* iterator koji pokazuje na prvi element popisa ili spremnika. Njegova uporaba s vektorom implicitno bi bila s:

vektor < char > vtr { 'A' , 'B' , 'C' , 'D' , 'I' } ;
vektor < char > :: const_iterator to = vtr. početi ( ) ;

Funkcija predloška više je primjenjiva na početnu () naredbu (drugu naredbu).

Pristup

Funkcija predloška:

šablona < razreda C > constexpr auto veličina ( konst C i c ) - > decltype ( c. veličina ( ) ) ;

Ovo vraća veličinu spremnika. Primjer vektora:

vektor < char > vtr { 'A' , 'B' , 'C' , 'D' , 'I' } ;
int N = vtr. veličina ( ) ;
cout << N << endl ;

Izlaz je 5.

Funkcija predloška:

šablona < razreda I > [ [ noodbaciti ] ] constexpr bool prazan ( popis_inicijalizatora < I > The ) noexcept ;

Vraća true ako je popis prazan ili false u suprotnom. Primjer vektora:

vektor < char > vtr { 'A' , 'B' , 'C' , 'D' , 'I' } ;
bool s = vtr. prazan ( ) ;
cout << s << endl ;

Izlaz je 0 za laž.

Pristup rasponu

Postoje i druge funkcije predloška koje koriste iteratore koje vektor koristi za svoje probleme raspona. Raspon je uzastopni skup elemenata spremnika.

Funkcija predloška:

šablona < razreda C > constexpr auto početi ( C i c ) - > decltype ( c. početi ( ) ) ;

Ovo vraća iterator koji pokazuje na prvi element na popisu. auto ovdje znači da je povratna vrijednost određena prilikom procjene. Primjer za vektor:

vektor < char > vtr { 'A' , 'B' , 'C' , 'D' , 'I' } ;
vektor < char > :: iterator to = vtr. početi ( ) ;
cout << * to << ' \n ' ;

Izlaz je A. Iterator koji se ovdje vraća je iterator s nasumičnim pristupom. Iterator stalnog nasumičnog pristupa mogao je biti vraćen – vidi kasnije.

Predložak funkcije:

šablona < razreda C > constexpr auto kraj ( konst C i c ) - > decltype ( c. kraj ( ) ) ;

Vraća stalni iterator koji pokazuje na posljednji element popisa. Vektorski kod:

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

Izlaz je 'E D'. Konstantni iterator može se povećati ili smanjiti, ali vrijednost na koju pokazuje ne može se promijeniti. Mogao se vratiti normalan iterator nasumičnog pristupa – vidi kasnije.

Predložak funkcije:

šablona < razreda I > constexpr obrnuti_iterator < konst I * > rbegin ( popis_inicijalizatora < I > The ) ;

Vraća posljednju vrijednost na popisu. rbegin() pokazuje na posljednji element popisa, a ne dalje od posljednjeg elementa popisa, kao što to čini end(). Primjer vektora:

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

Izlaz je: E D. S obrnutim iteratorom, ++ ima suprotan učinak za dvosmjerni iterator.

Predložak funkcije:

šablona < razreda I > constexpr obrnuti_iterator < konst I * > pravi ( popis_inicijalizatora < I > The ) ;

Točke neposredno prije prvog elementa liste. Primjer vektora:

vektor < char > vtr { 'A' , 'B' , 'C' , 'D' , 'I' } ;
vektor < char > :: obrnuti_iterator to = vtr. pravi ( ) ;
-- to ;
cout << * to << ' ' ;
-- to ;
cout << * to << endl ;

Izlaz je A B. S obrnutim iteratorom, — ima suprotan učinak za ++ dvosmjernog iteratora.

Pod ovim naslovom postoje i druge funkcije predloška – pogledajte kasnije.

Umetanje iteratora

reverse_iterator je adaptor iteratora, a ne zapravo iterator. Iterator umetanja također je iteratorski adaptor. Zadovoljava sve zahtjeve izlaznog iteratora, plus vlastite zahtjeve. Postoji u tri oblika u C++: back_inserter, front_inserter i inserter. Svaki od njih ima svog konstruktora.

back_inserter:

Umeci straga!
Važni prototipovi:

eksplicitan back_insert_iterator ( Kontejner i x ) ;
back_insert_iterator i operater = ( ime tipa Kontejner :: vrsta_vrijednosti && vrijednost ) ;

Primjer vektora:
Vektor nema nijednu funkciju člana za umetanje koja umeće straga. Međutim, funkcija članica push_back(t) može se tako vidjeti.

prednji_umetač

Umetci sprijeda!
Važni prototipovi:

eksplicitan prednji_umetnuti_iterator ( Kontejner i x ) ;
prednji_umetnuti_iterator i operater = ( ime tipa Kontejner :: vrsta_vrijednosti && vrijednost ) ;

Primjer vektora:
Vektor nema nijednu funkciju člana za umetanje koja umeće sprijeda. Vektor također nema funkciju člana push_front(t).

Dobra vijest je da vektor ima funkcije člana za umetanje koje mogu umetnuti bilo gdje, na početku, unutar ili na kraju vektora.

umetač

Ovaj bi iterator umetnuo na početak, unutar ili na kraj vektora.

Važni prototipovi:

insert_iterator ( Kontejner i x, ime tipa Kontejner :: iterator ja ) ;
insert_iterator i operater = ( ime tipa Kontejner :: vrsta_vrijednosti && vrijednost ) ;

Primjer vektora:

vektor < char > vtr { 'A' , 'B' , 'C' , 'D' , 'I' } ;
vektor < char > :: iterator to = vtr. početi ( ) ;
to = to + 2 ;
vtr. umetnuti ( to, 'c' ) ;

za ( int ja = 0 ; ja < vtr. veličina ( ) ; ja ++ )
cout << vtr [ ja ] << ', ' ;
cout << endl ;

Izlaz je:

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

Izraz za umetanje vektora je:

vtr. umetnuti ( to, 'c' ) ;

Umeće element neposredno prije pokazivača na koji pokazuje.

Premjesti iterator

move_iterator je također adaptor iteratora. Sljedeći program sličan je primjeru koji se nalazi u C++ specifikaciji:

#include
#include
#uključi
korištenjem imenski prostor std ;

int glavni ( )
{
popis < char > pogl { 'A' , 'B' , 'C' , 'D' , 'I' } ;
vektor < char > vtr ( make_move_iterator ( pogl. početi ( ) ) , make_move_iterator ( pogl. kraj ( ) ) ) ;

cout << 'Sadržaj izvornog popisa:' << endl ;
za ( auto to = pogl. početi ( ) ; to ! = pogl. kraj ( ) ; to ++ )
cout << * to << ', ' ;
cout << endl << endl ;

cout << 'Vektorski sadržaj:' << endl ;
za ( int ja = 0 ; ja < vtr. veličina ( ) ; ja ++ )
cout << vtr [ ja ] << ', ' ;
cout << endl ;

povratak 0 ;
}

Izlaz je:

Izvorni sadržaj popisa:
A B C D E,

Vektorski sadržaj:
A B C D E,

Ovaj iterator pretvara izvornu vrijednost u rvalue prije nego što je postavi na odredište.

Zaključak

Glavni iteratori u C++ su ulazni iterator, izlazni iterator, naprijed iterator, dvosmjerni iterator i iterator slučajnog pristupa. C++ standardna biblioteka ima neke predloške funkcija koji koriste ove iteratore. Vektor koristi ove iteratore kroz predloške funkcija. Vektor ima različita imena za neke od ovih iteratora. Također postoje adapteri iteratora, a to su: reverse_iterator, adaptor iteratora i move_iterator. Postoje i neke varijante iteratora. Dovoljno je uključiti u program da biste imali sve te značajke. Nakon razumijevanja uloge ovih iteratora, adaptora i predložaka funkcija koji ih koriste, korištenje iteratora s vektorima postaje intuitivno.