logo

Iteratori C ++ STL

Tāds  iterators C ++  ir rādītājam līdzīgs objekts, kas norāda uz STL konteinera elementu. Tos parasti izmanto, lai cilpotu caur STL konteinera saturu C ++. Galvenā STL iteratoru priekšrocība ir tā, ka tie padara STL algoritmus neatkarīgi no izmantotā konteinera veida. Mēs varam vienkārši nodot iteratoru konteinera elementiem, nevis pašam konteineram uz STL algoritmiem.

Iteratora deklarācija

Katram C ++ STL konteineram ir savs iterators. Tāpēc mums ir jāpaziņo iteratoram kā:



C++
<type>::iterator it; 

kur

  • Tips: Konteinera tips, par kuru tiek deklarēts iterators.
  • tas: Vārds, kas piešķirts iterator objektam.

Pēc tam mēs to varam inicializēt, piešķirot kādu derīgu iteratoru. Ja mums jau ir iterators, kas jāpiešķir Delcaration laikā, mēs varam izlaist tipa deklarāciju, izmantojot auto Atslēgvārds.

C++
auto it = iter 

kur iters ir iterators, kas piešķirts jaunizveidotajam iteratoram.



Mūsu C ++ kurss Ietver iteratoru izmantošanu STL, nodrošinot, ka saprotat, kā šķērsot dažādus konteineru veidus.

Iteratoru piemērs

Zemāk esošā programma parāda, kā izmantot iteratoru, lai šķērsotu vektora konteineru:

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; } 

Izvade
1 2 3 4 5 

Kā jūs, iespējams, pamanījāt, ka esam izmantojuši Vector :: sākas () un vektors :: beigas () funkcija. Šīs funkcijas ir STD :: vektora locekļu funkcijas, kas atgriež iteratoru pirmajā un vienā elementā pēc vektora pēdējā elementa. Mēs izmantojam iteratoru atgriešanu, ja šīs funkcijas atkārto vektorus.



Konteinera iteratora funkcijas

C ++ STL nodrošina dažas dalībnieku funkcijas STL konteiners Tas atgriež iteratorus vismaz uz pirmo un pēdējo elementu. Šīs locekļu funkcijas ir noteiktas gandrīz visos STL konteinerā (atstājot dažus ierobežotus piekļuves konteinerus, piemēram, kaudze rinda ) ar tādu pašu konsekvences nosaukumu.

Šajā tabulā ir uzskaitītas visas metodes, kas iteratoru atgriež konteineros:

Iteratora funkcija

Atgriešanās vērtība

sākt ()

Atgriež iteratoru konteinera sākumā.

beigas ()

Atgriež iteratoru teorētiskajam elementam tieši pēc konteinera pēdējā elementa.

cbegin ()

Atgriež pastāvīgu iteratoru konteinera sākumā. Pastāvīgs iterators nevar modificēt tā elementa vērtību, uz kuru tā norāda.

daži ()

vicky kaushal vecums

Atgriež pastāvīgu iteratoru teorētiskajam elementam tieši pēc konteinera pēdējā elementa.

rbegin ()

Atgriež atpakaļgaitas iteratoru konteinera sākumā.

atveidot ()

Atgriež reverso iteratoru teorētiskajam elementam tieši pēc konteinera pēdējā elementa.

crbegin ()

Atgriež pastāvīgu reversu iteratoru konteinera sākumā.

Crend ()

Atgriež pastāvīgu reverso iteratoru teorētiskajam elementam tieši pēc konteinera pēdējā elementa.

Piemēram, ja lieta ir vektora nosaukums, tad mēs varam izmantot iepriekšminētās metodes, kā parādīts zemāk:

C++
vec.begin() vec.rbegin() vec.cbegin() vec.crbegin() vec.end() vec.rend()  vec.cend() vec.crend() 

Iteratoru operācijas

Tāpat kā rādītāja aritmētika, ir dažas operācijas, kas ir atļautas C ++ iteratoriem. Tos izmanto, lai nodrošinātu dažādas funkcijas, kas palielina iteratoru nozīmi. Ir 5 derīgi iteratora operācijas C ++ :

  • Atkārtotie iteratori
  • Iteratoru palielināšana/samazināšana
  • Iteratoru pievienošana/atņemšana iteratoriem
  • Atņemot citu iteratoru
  • Salīdzinot iteratorus

Atkārtotie iteratori

Dereferencēšanas operācija ļauj lietotājiem veikt Piekļuve vai atjaunināšana Iteratora norādītā elementa vērtība. Mēs izmantojam (*) Indikācijas operators lai atceltu iteratorus tāpat kā norādes.

C++
// Access *it; // Update *it = new_val;  

kur new_val ir jaunā vērtība, kas piešķirta elementam, kuru norāda iterators tas Apvidū

Iteratoru palielināšana/samazināšana

Mēs varam palielināt vai samazināt iteratoru ar 1, izmantojot (++) vai (-) operatori attiecīgi. Palielināšanas darbība pārvieto iteratoru uz nākamo konteinera elementu, kamēr samazināšanas darbība pārvieto iteratoru uz iepriekšējo elementu.

C++
it++; // post-increment ++it; // pre-increment it--; // post-decrement --it; // pre-decrement 

Iteratoru pievienošana/atņemšana iteratoriem

No iteratoriem mēs varam arī pievienot vai atņemt veselu skaitli. Tas vairāk būs nākamais iterators vai iepriekšējā pozīcijā saskaņā ar pievienoto veselo skaitli.

C++
// Addition it + int_val;  // Subtraction it - int_val;  

kur int_val ir veseli skaitļi, kas tiek pievienoti vai atņemti no iteratora tas Apvidū

Atņemot citu iteratoru

Mēs varam atņemt vienu iteratoru no otra, lai atrastu attālumu (vai elementu skaitu) starp atmiņu, uz kuru viņi norāda.

C++
it1 - it2 

Salīdzinot iteratorus

Mēs varam arī pārbaudīt abus viena veida iteratorus viens pret otru, lai atrastu attiecības starp tiem. Mēs varam izmantot relāciju operatorus, piemēram, (==) vienlīdzību un (! =) Nevienlīdzības operatorus kopā ar citiem relāciju operatoriem, piemēram,< > <= >=.

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 

Iteratoru veidi C ++

STL iteratorus var sadalīt, pamatojoties uz operācijām, kuras var veikt. C ++ ir 5 galvenie iteratoru veidi, kas uzskaitīti zemāk esošajā tabulā kopā ar atbalstītajiem konteineriem un atbalstītām iteratora operācijām.

Iterators

Apraksts

Atbalstītie konteineri

Atbalstītās operācijas

Ievades iterators

Tas ir vienvirziena iterators, ko izmanto vērtību lasīšanai.

Ieejas plūsma

Paaugstināšanas vienlīdzības samazināšana

Izvadiet iteratoru

Tas ir arī vienvirziena iterators, bet tiek izmantots vērtību piešķiršanai. Tas nevar piekļūt vērtībām.

Izejas plūsma

Dereferencēšana (tikai rakstiet) pieaugums

Uz priekšu iteratori

Tas var piekļūt un, kā arī piešķirt vērtības. Tā ir gan ieejas, gan izejas iteratora kombinācija.

Forward_list Unordered_map Unordered_set

Paaugstināšanas vienlīdzības samazināšana

Divvirzienu iteratori

Tas var pārvietoties abos virzienos vai nu uz priekšu, vai atpakaļ. Konteineriem patīk saraksta komplekts un multimap atbalsta divvirzienu iteratorus.

Saraksta kartes iestatīšana multimap multiset

Paaugstināšanās/samazināšanas vienlīdzības samazināšana

Bezmaksas piekļuves iteratori

Nejaušas piekļuves iteratori ir iteratori, kurus var izmantot, lai piekļūtu elementiem attālumā no elementa, kurus viņi norāda, lai piedāvātu tādu pašu funkcionalitāti kā norādes.

Vector Deque masīva virkne

pandas loc

Viss

Kā mēs, iespējams, pamanījām no iepriekš minētās tabulas, izņemot ieejas un izvades iteratorus Kad mēs ejam pa tabulu, iteratora tips satur virs iteratora funkcijas, kā arī dažas jaunas funkcijas.

Iteratora adapteri

Iterator adapteri C ++ ir īpašs iteratoru veids, kas veidots virs tradicionālajiem iteratoriem, lai nodrošinātu specializētu funkcionalitāti. C ++ ir daudz iteratora adapteru, no kuriem daži ir norādīti zemāk:

Iteratora adapteru tips

Apraksts

Atpakaļgaitas iterators

Reversais iterators ir veidots virs divvirzienu vai augstāka veida operatora un ļauj lietotājiem šķērsot konteineru apgrieztā virzienā.

Straumes iteratori

Straumes iteratori, proti, Istream un Ostream iteratori, ir veidoti attiecīgi uz ieejas un izvades iteratoriem. Šie iteratori ļauj lietotājiem izmantot straumes kā konteinerus.

Pārvietojiet iteratorus

Pārvietot iteratorus izmanto, lai ieviestu STL algoritmos pārcelšanās semantiku. Pārvietošanās iteratori pārvieto kopēto konteinera datu īpašumtiesības uz kopēšanas konteineru, neveidojot papildu eksemplārus.

INSERTER ITERATORA

Ievēršanas iteratori ļauj ievietot dotos elementus kādā konteinera stāvoklī. C ++ ir trīs ieliktņu iteratori:

  1. back_insert_iterator: Ieliktne konteinera aizmugurē.
  2. front_insert_iterator: Ielikt konteinera priekšpusē.
  3. INSERT_ITERATOR: INSERTS jebkur citur konteinerā.

Šos iteratorus var izveidot, izmantojot back_inserter () front_inserter () ievietot () funkcijas C ++.

Iteratora lietderības funkcijas C ++

C ++ STL nodrošina dažādas funkcijas, lai vienkāršotu darbu ar iteratoriem. Tie ir uzskaitīti zemāk esošajā tabulā:

Darbība Apraksts Sintakse
std :: Advance Veicina iteratoru ar noteiktu pozīciju skaitu. uz priekšu ( tas n )
std :: nākamais Atgriež iteratoru, kas ir noteikts pozīciju skaits pirms dotā iteratora. blakus ( tas n )
Std :: prev Atgriež iteratoru, kas ir noteikts skaits pozīciju aiz dotā iteratora. iepriekšējs ( tas n )
std :: attālums Atgriež elementu skaitu starp diviem iteratoriem. attālums ( it1 it2 )
std :: SāktAtgriež iteratoru dotā konteinera pirmajam elementam. sākt ( konteiners )
std :: beigasAtgriež iteratoru elementam pēc dotā konteinera pēdējā elementa. beigas ( konteiners )
std :: rbeginAtgriež atpakaļgaitas iteratoru dotā konteinera pēdējam elementam. rbegīns ( konteiners )
std :: rendAtgriež atpakaļgaitas iteratoru elementam pirms dotā konteinera pirmā elementa. padarīt ( konteiners )
std :: INSERTER Izveido ieliktņa iteratoru, kas noteiktā stāvoklī ievieto elementus konteinerā. ieliktnis ( konteinera pozīcija )
std :: back_inserter Izveido aizmugures ievietošanas iteratoru, kas konteinera galā pievieno elementus. Back_inserter ( konteiners )
std :: front_inserter Izveido priekšējo ieliktņu iteratoru, kas konteinera priekšpusē ievieto elementus. Front_inserter ( konteiners )

Iteratoru pielietojumi ar piemēriem

Iteratori tiek plaši izmantoti C ++ daudzos dažādos mērķos, strādājot ar STL konteineriem un algoritmiem. Tālāk ir daži galvenie iteratoru pielietojumi C ++, kuru koda piemēri:

Šķērsojot konteinerus

Pārejot STL konteinerus, ir visvienkāršākais iteratoru pielietojums. Šajā sakarā mēs izmantojam sākuma () un beigu () funkcijas, lai sāktu un gala iteratorus, lai šķērsotu visu konteineru. Būtībā mēs turpinām palielināt sākuma iteratoru, līdz tas nav vienāds ar beigām.

Piemērs

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; } 

Izvade
10 20 30 40 50 

Kā parādīts iepriekš minētajā kodā, mēs šķērsojam komplekta konteineru. Līdzīgi mēs varam izmantot to pašu pieeju, lai šķērsotu jebkuru konteineru.

Konteinera apvēršana

Reversie iteratori ļauj jums šķērsot konteineru no beigām līdz sākumam, manuāli rīkojoties ar apgriezienu.

Piemērs

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; } 

Izvade
50 40 30 20 10 

No konteineriem neatkarīgi algoritmi

Iteratori ļauj algoritmiem strādāt ar jebkurām konteineru tipa veidošanas funkcijām, piemēram, std :: sort () std :: find () un std :: for_each () elastīgāka. Faktiskā konteinera vietā varat nodot iteratorus.

Piemērs

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; } 

Izvade
10s in Vector: 2 10s in Multiset: 3

Iteratoru papildu pielietojumi

Ir vairāk STL iteratoru pielietojumu:

  • Attāluma aprēķins: Izmantojot std :: attālumu () iteratori, palīdz aprēķināt elementu skaitu starp divām pozīcijām konteinerā.
  • Straumes iterācija: Straumes iteratori ļauj ārstēt ievades/izvades plūsmas, piemēram, konteinerus, padarot to vieglāku lasīšanu no straumēm un rakstīt, izmantojot STL algoritmus.
  • Pārvietojiet semantiku STL algoritmos: Pārvietot iteratorus ievieš STL algoritmos SIT semantiku, kas palīdz palielināt veiktspēju un efektivitāti, izvairoties no nevajadzīgas kopēšanas. Dati tiks pārvietoti saskaņā ar pārcelšanās semantikas noteikumiem.
  • Pielāgoti iteratori datu struktūrām: Pielāgotus iteratorus var ieviest ne-STL datu struktūrām, piemēram, kokiem vai grafikiem, lai sniegtu atbalstu STL algoritmiem un daudzām citām funkcijām. Mums, iespējams, būs jāievēro daži noteikumu un konvenciju kopums, lai nodrošinātu pienācīgu pieaugumu samazināšanu un citas operācijas.