C++ vektorové iterátory

C Vektorove Iteratory



Hlavnými iterátormi v C++ sú vstupný iterátor, výstupný iterátor, dopredný iterátor, obojsmerný iterátor a iterátor náhodného prístupu. Reverzný iterátor v skutočnosti nie je iterátor; je to iterátorový adaptér. Existujú niektoré varianty iterátorov, napríklad konštantný iterátor.

Iterátor je prepracovaný ukazovateľ. Podobne ako ukazovateľ ukazuje na objekty rovnakého typu v pamäti v rôznych časoch. Všetky iterátory sú dereferencovateľné, okrem iterátora výstupu, ktorý je možné dereferencovať len pre množinu typov. Dereferenceable znamená, že hodnotu, na ktorú ukazuje ukazovateľ alebo iterátor, možno získať pomocou operátora nepriameho smeru, *. K niektorým iterátorom možno rovnakým spôsobom pridať celé číslo a na rovnaký účel by sa celé číslo pridalo do ukazovateľa.

Otázky pre tento článok sú: Čo sú tieto iterátory? Ktoré z týchto iterátorov sa používajú s vektorom C++? Ako sa tieto iterátory používajú s vektorom C++? Tento článok odpovedá na všetky tieto otázky zjednodušeným spôsobom. Na konci tohto článku, keď budú všetky tieto otázky zodpovedané, budú vektorové iterátory C++ intuitívne a prirodzené (pre čitateľa).







Obsah článku

Zhrnutie iterátorov C++

Iterátor vstupu



Myšlienkou vstupného iterátora je, aby program dostal vstupnú hodnotu. Na rozdiel od výstupného iterátora je vstupný iterátor vždy dereferencovateľný. Pre dva vstupné iterátory, a a b, „a == b“ neznamená „++a == ++b“.



Iterátor výstupu
Myšlienkou výstupného iterátora je, aby program uvoľnil výstupnú hodnotu. Na rozdiel od vstupného iterátora nie je výstupný iterátor vždy dereferencovateľný. Je dereferencovateľná len pre množinu typov.





Dopredný iterátor
Dopredný iterátor môže skenovať vektor od začiatku až do konca, jeden po druhom (inkrementuje). Má všetky požiadavky vstupného iterátora plus ďalšie požiadavky. Môže nahradiť iterátor vstupu. Pre dva dopredné iterátory, a a b, „a == b“ znamená „++a == ++b“.

Obojsmerný iterátor
Obojsmerný iterátor dokáže skenovať vektor od začiatku do konca, jeden po druhom. Od konca po začiatok jeden po druhom (zníženie). Má všetky požiadavky dopredného iterátora plus ďalšie požiadavky. Môže nahradiť dopredný iterátor. Pre dva obojsmerné iterátory, a a b,



„a == b“ znamená „++a == ++b“
a
„–a == –b“ znamená „a == b“.

Iterátor náhodného prístupu

Iterátor náhodného prístupu má všetky požiadavky obojsmerného iterátora plus ďalšie požiadavky. Môže nahradiť obojsmerný iterátor. Iterátor náhodného prístupu má tú výhodu, že ak práve ukazuje na prvý prvok a vyžaduje sa štvrtý prvok, preskočí druhý a tretí prvok a ukáže na štvrtý prvok. Opačné preskakovanie smerom nadol platí.

Reverzný iterátor

Všimnite si, že C++ nemá normálny reverzný iterátor, pretože má dopredný iterátor. Existuje teda adaptér nazývaný reverzný iterátor. Existuje viac dobrých správ: reverzný iterátor spĺňa všetky požiadavky obojsmerného iterátora.

Konštantný iterátor

Ak sa o iterátore hovorí, že je to konštruktér, prvok, na ktorý ukazuje, nemožno upraviť.

Vektorové konštrukcie a prístup

Kontajnery v C++ sú: pole tried, deque, forward_list, list, vector, map, set, unordered_map a unordered_set. Vektor je kontajner. Niektoré šablóny funkcií v štandardnej knižnici C++ pracujú s iterátormi priamo alebo nepriamo. Kontajnery C++, ako aj vektor, používajú tieto funkcie. Tieto funkcie môžu byť sprístupnené programu C++ pomocou niektorej z nasledujúcich inklúznych direktív:

#include

alebo

#include

Zahrnutím ktoréhokoľvek z ďalších kontajnerov sa sprístupnia aj tieto šablóny funkcií. Šablóna funkcie je určená pre funkciu, ktorá môže pracovať s rôznymi typmi údajov. Vektor používa iterátory prostredníctvom týchto šablón funkcií. Niektoré zo šablón funkcií a ich vzťah k vektoru sú nasledovné:

Stavebníctvo

Funkcia šablóny:

šablóna < trieda C > constexpr auto údajov ( C & c ) - > decltype ( c. údajov ( ) ) ;

auto znamená, že návratový typ je určený pri vyhodnocovaní funkcie. c je objekt triedy C.

Príkladom implicitne skonštruovaného vektorového objektu je:

vektor < char > vtr ;

Tu je objekt c prázdny.

Funkcia šablóny:

šablóna < trieda A > constexpr konšt A * údajov ( zoznam inicializátorov < A > The ) nookrem ;

Tu je E* iterátor, ktorý ukazuje na prvý prvok zoznamu alebo kontajnera. Jeho použitie s vektorom by bolo implicitne s:

vektor < char > vtr { 'A' , 'B' , 'C' , 'D' , „A“ } ;
vektor < char > :: const_iterator to = vtr. začať ( ) ;

Funkcia šablóny je vhodnejšia na začiatok () príkaz (druhý príkaz).

Prístup

Funkcia šablóny:

šablóna < trieda C > constexpr auto veľkosť ( konšt C & c ) - > decltype ( c. veľkosť ( ) ) ;

Tým sa vráti veľkosť kontajnera. Vektorový príklad:

vektor < char > vtr { 'A' , 'B' , 'C' , 'D' , „A“ } ;
int N = vtr. veľkosť ( ) ;
cout << N << endl ;

Výstup je 5.

Funkcia šablóny:

šablóna < trieda A > [ [ noodhodiť ] ] constexpr bool prázdny ( zoznam inicializátorov < A > The ) nookrem ;

Vráti hodnotu true, ak je zoznam prázdny alebo v opačnom prípade je nepravda. Vektorový príklad:

vektor < char > vtr { 'A' , 'B' , 'C' , 'D' , „A“ } ;
bool s = vtr. prázdny ( ) ;
cout << s << endl ;

Výstup je 0 pre nepravdu.

Prístup k dosahu

Existujú ďalšie funkcie šablón, ktoré používajú iterátory, ktoré vektor používa na riešenie problémov s rozsahom. Rozsah je po sebe idúca množina prvkov kontajnera.

Funkcia šablóny:

šablóna < trieda C > constexpr auto začať ( C & c ) - > decltype ( c. začať ( ) ) ;

Toto vráti iterátor ukazujúci na prvý prvok v zozname. auto tu znamená, že návratová hodnota sa určí pri vyhodnotení. Príklad pre vektor:

vektor < char > vtr { 'A' , 'B' , 'C' , 'D' , „A“ } ;
vektor < char > :: iterátor to = vtr. začať ( ) ;
cout << * to << ' \n ' ;

Výstup je A. Tu vrátený iterátor je iterátor s náhodným prístupom. Mohol sa vrátiť konštantný iterátor náhodného prístupu – pozri neskôr.

Šablóna funkcie:

šablóna < trieda C > constexpr auto koniec ( konšt C & c ) - > decltype ( c. koniec ( ) ) ;

Vráti konštantný iterátor ukazujúci na posledný prvok zoznamu. Kód vektora:

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

Výstup je „E D“. Konštantný iterátor môže byť inkrementovaný alebo dekrementovaný, ale hodnota, na ktorú ukazuje, sa nedá zmeniť. Mohol byť vrátený normálny iterátor náhodného prístupu – pozri neskôr.

Šablóna funkcie:

šablóna < trieda A > constexpr reverzný_iterátor < konšt A * > začať ( zoznam inicializátorov < A > The ) ;

Vráti poslednú hodnotu v zozname. rbegin() ukazuje na posledný prvok zoznamu a nie za posledný prvok zoznamu, ako to robí end(). Vektorový príklad:

vektor < char > vtr { 'A' , 'B' , 'C' , 'D' , „A“ } ;
vektor < char > :: reverzný_iterátor to = vtr. začať ( ) ;
cout << * to << ' ' ;
++ to ;
cout << * to << endl ;

Výstup je: E D. S reverzným iterátorom má ++ opačný efekt pre obojsmerný iterátor.

Šablóna funkcie:

šablóna < trieda A > constexpr reverzný_iterátor < konšt A * > robí ( zoznam inicializátorov < A > The ) ;

Body tesne pred prvým prvkom zoznamu. Vektorový príklad:

vektor < char > vtr { 'A' , 'B' , 'C' , 'D' , „A“ } ;
vektor < char > :: reverzný_iterátor to = vtr. robí ( ) ;
-- to ;
cout << * to << ' ' ;
-- to ;
cout << * to << endl ;

Výstup je A B. S reverzným iterátorom — má opačný efekt pre ++ obojsmerného iterátora.

Pod týmto názvom sú ďalšie funkcie šablón – pozri neskôr.

Vložiť iterátory

reverse_iterator je iterátorový adaptér, nie v skutočnosti iterátor. Iterátor vloženia je tiež adaptérom iterátora. Spĺňa všetky požiadavky výstupného iterátora plus jeho vlastné požiadavky. V C++ existuje v troch formách: back_inserter, front_inserter a inserter. Každý z nich má svojho konštruktora.

back_inserter:

Vsadky vzadu!
Dôležité prototypy:

explicitné back_insert_iterator ( Kontajner & X ) ;
back_insert_iterator & operátor = ( typový názov Kontajner :: typ_hodnoty && hodnotu ) ;

Vektorový príklad:
Vektor nemá žiadnu členskú funkciu vloženia, ktorá sa vkladá dozadu. Členskú funkciu push_back(t) však možno takto vidieť.

front_inserter

Vložky vpredu!
Dôležité prototypy:

explicitné front_insert_iterator ( Kontajner & X ) ;
front_insert_iterator & operátor = ( typový názov Kontajner :: typ_hodnoty && hodnotu ) ;

Vektorový príklad:
Vektor nemá žiadnu funkciu vloženia člena, ktorá sa vkladá spredu. Vektor tiež nemá členskú funkciu push_front(t).

Dobrou správou je, že vektor má vložiť členské funkcie, ktoré možno vložiť kamkoľvek, na začiatok, do alebo na koniec vektora.

vkladač

Tento iterátor by sa vložil na začiatok, do alebo na koniec vektora.

Dôležité prototypy:

insert_iterator ( Kontajner & X, typový názov Kontajner :: iterátor i ) ;
insert_iterator & operátor = ( typový názov Kontajner :: typ_hodnoty && hodnotu ) ;

Vektorový príklad:

vektor < char > vtr { 'A' , 'B' , 'C' , 'D' , „A“ } ;
vektor < char > :: iterátor to = vtr. začať ( ) ;
to = to + 2 ;
vtr. vložiť ( to, 'c' ) ;

pre ( int i = 0 ; i < vtr. veľkosť ( ) ; i ++ )
cout << vtr [ i ] << ',' ;
cout << endl ;

Výstupom je:

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

Výraz vektorového vloženia je:

vtr. vložiť ( to, 'c' ) ;

Vloží prvok tesne pred ukazovateľ (to), na ktorý ukazuje.

Iterátor presunu

Move_iterator je tiež adaptér iterátora. Nasledujúci program je podobný príkladu, ktorý je v špecifikácii C++:

#include
#include
#include
použitím menný priestor std ;

int Hlavná ( )
{
zoznam < char > chs { 'A' , 'B' , 'C' , 'D' , „A“ } ;
vektor < char > vtr ( make_move_iterator ( chs. začať ( ) ) , make_move_iterator ( chs. koniec ( ) ) ) ;

cout << 'Pôvodný obsah zoznamu:' << endl ;
pre ( auto to = chs. začať ( ) ; to ! = chs. koniec ( ) ; to ++ )
cout << * to << ',' ;
cout << endl << endl ;

cout << 'Vektorový obsah:' << endl ;
pre ( int i = 0 ; i < vtr. veľkosť ( ) ; i ++ )
cout << vtr [ i ] << ',' ;
cout << endl ;

vrátiť 0 ;
}

Výstupom je:

Pôvodný obsah zoznamu:
A B C D E,

Vektorový obsah:
A B C D E,

Tento iterátor skonvertuje zdrojovú hodnotu na rvalue pred jej umiestnením do cieľa.

Záver

Hlavnými iterátormi v C++ sú vstupný iterátor, výstupný iterátor, dopredný iterátor, obojsmerný iterátor a iterátor s náhodným prístupom. Štandardná knižnica C++ má niektoré šablóny funkcií, ktoré používajú tieto iterátory. Vektor používa tieto iterátory prostredníctvom šablón funkcií. Vektor má pre niektoré z týchto iterátorov rôzne názvy. Existujú tiež iterátorové adaptéry, ktorými sú: reverse_iterator, iterator adaptér a move_iterator. Existujú aj niektoré varianty iterátorov. Stačí zahrnúť do programu, aby mal všetky tieto funkcie. Po pochopení úlohy týchto iterátorov, adaptérov a funkčných šablón, ktoré ich používajú, sa používanie iterátorov s vektormi stáva intuitívnym.