logo

Iteraattorit C ++ STL: ssä

Yksi  iteraattori C ++: ssa  on osoittimen kaltainen objekti, joka osoittaa STL-säiliön elementin. Niitä käytetään yleensä silmukan STL -säiliön sisällön läpi C ++: ssa. STL -iteraattorien tärkein etu on, että he tekevät STL -algoritmeista riippumatta käytetyn säiliön tyypistä. Voimme vain siirtää iteraattorin säiliöelementeihin itse säiliön sijasta STL -algoritmeihin.

Iteraattori

Jokaisella C ++ STL: n säiliöllä on oma iteraattori. Joten meidän on julistettava iteraattori seuraavasti:



C++
<type>::iterator it; 

jossa

  • tyyppi: Säiliötyyppi, jolle iteraattori julistetaan.
  • se: Iteraattoriobjektille määritetty nimi.

Voimme sitten alustaa sen määrittämällä jokin kelvollinen iteraattori. Jos meillä on jo iteraattori, joka määritetään Delcation -ajankohtana, voimme ohittaa tyypin ilmoituksen käyttämällä auto Avainsana.

C++
auto it = iter 

jossa iter on äskettäin luotu IT -iteraattori osoitettu iteraattori.



Meidän C ++ -kurssi kattaa iteraattorien käytön STL: ssä varmistaen, että ymmärrät kuinka erilaisia ​​säiliötyyppejä kulkee.

Esimerkki iteraattoreista

Alla oleva ohjelma kuvaa, kuinka iteraattoria käytetään vektorisäiliön kulkemiseen:

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

Tulos
1 2 3 4 5 

Kuten olet ehkä huomannut, olemme käyttäneet vektori :: begin () ja vektori :: end () toiminto. Nämä toiminnot ovat jäsentoiminnot std :: vektorille, joka palauttaa iteraattorin ensimmäiseen ja yhden elementin vektorin viimeisen elementin jälkeen. Käytämme iteraattoreita palauttamaan nämä toiminnot iteroidakseen vektoreita.



Konttikonttifunktiot

C ++ STL tarjoaa joitain jäsentoimintoja vuonna STL -säiliö Se palauttaa iteraattorit ainakin ensimmäiseen ja viimeiseen elementtiin. Nämä jäsentoiminnot on määritelty melkein kaikissa STL -säiliöissä (jätetään joitain rajoitettuja pääsyastiat, kuten pino jonottaa ) Saman nimen johdonmukaisuus.

Seuraavassa taulukossa luetellaan kaikki menetelmät, jotka palauttavat iteraattorin säiliöihin:

Iteraattoritoiminto

Palautusarvo

alkaa()

Palauttaa iteraattorin säiliön alkuun.

loppu ()

Palauttaa iteraattorin teoreettiseen elementtiin heti säiliön viimeisen elementin jälkeen.

cbegin ()

Palauttaa jatkuvan iteraattorin säiliön alkuun. Jatkuva iteraattori ei voi muokata sen osoitettavan elementin arvoa.

muutama ()

kolmas normaalimuoto

Palauttaa jatkuvan iteraattorin teoreettiseen elementtiin heti säiliön viimeisen elementin jälkeen.

rbegin ()

Palauttaa käänteisen iteraattorin säiliön alkuun.

Render ()

Palauttaa käänteisen iteraattorin teoreettiseen elementtiin heti säiliön viimeisen elementin jälkeen.

crbegin ()

Palauttaa jatkuvan käänteisen iteraattorin säiliön alkuun.

Crend ()

Palauttaa jatkuvan käänteisen iteraattorin teoreettiseen elementtiin heti säiliön viimeisen elementin jälkeen.

Esimerkiksi jos asia on vektorin nimi, voimme käyttää yllä olevia menetelmiä alla esitetyllä tavalla:

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

Iteraattorit

Aivan kuten osoittimen aritmeettinen, on joitain operaatioita, jotka ovat sallittuja C ++ -iteraattoreissa. Niitä käytetään tarjoamaan erilaisia ​​toimintoja, mikä lisää iteraattorien merkitystä. On 5 voimassa olevaa iteraattoritoiminnot C ++: ssa -

  • Iteraattoreiden poistaminen
  • Lisäävät iteraattorit/vähentävät
  • Kokonaisluvun lisääminen/vähentäminen iteraattoreihin
  • Vähennä toinen iteraattori
  • Iteraattoreiden vertailu

Iteraattoreiden poistaminen

Dereferencing -toimenpide antaa käyttäjille mahdollisuuden Pääsy tai päivitys iteraattorin osoittaman elementin arvo. Käytämme (*) epäsuoran operaattori Dereference iteraattoreihin aivan kuten osoittimet.

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

jossa new_val on uusi arvo, jonka iteraattori osoittaa elementille se .

Lisäävät iteraattorit/vähentävät

Voimme lisätä tai vähentää iteraattoria yhdellä käyttämällä (++) tai (-) operaattorit vastaavasti. Lisäysoperaatio siirtää iteraattorin seuraavaan elementtiin säiliössä, kun taas pienenemisoperaatio siirtää iteraattorin edelliseen elementtiin.

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

Kokonaisluvun lisääminen/vähentäminen iteraattoreihin

Voimme myös lisätä tai vähentää kokonaislukuarvoa iteraattoreista. Se lisää iteraattoria seuraavaksi tai edelliselle sijainnille lisätyn kokonaisluvun arvon mukaan.

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

jossa int_val Onko kokonaislukuarvot, joita lisätään tai vähennetään iteraattorista se .

Vähennä toinen iteraattori

Voimme vähentää yhden iteraattorin toisesta löytääksemme etäisyyden (tai elementtien lukumäärän) muistin välillä, johon he osoittavat.

C++
it1 - it2 

Iteraattoreiden vertailu

Voimme myös testata saman tyyppisiä kahta iteraattoria toisiaan vastaan ​​löytääksemme heidän välistä suhdetta. Voimme käyttää relaatiooperaattoreita, kuten (==) tasa -arvoa ja (! =) Epätasa -arvon operaattoreita yhdessä muiden relaatiooperaattoreiden kanssa, kuten< > <= >=.

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 

Iteraattorityypit C ++: ssa

STL -iteraattorit voidaan jakaa niille suoritettavien toimintojen perusteella. C ++: ssa on 5 päätyyppiä, jotka on lueteltu alla olevassa taulukossa, tuettujen säiliöiden ja tuettujen iteraattoritoimintojen kanssa.

Iteraattori

Kuvaus

Tuetut astiat

Tuetut operaatiot

Syöttö iteraattori

Se on yksisuuntainen iteraattori, jota käytetään arvojen lukemiseen.

Syöttövirta

Välistäminen lisäys tasa -arvo

Lähtö -iteraattori

Se on myös yksisuuntainen iteraattori, mutta sitä käytetään arvojen määrittämiseen. Se ei pääse arvoihin.

Lähtövirta

Dereferencing (vain kirjoita) lisäys

Eteenpäin iteraattorit

Se voi käyttää ja määrittää arvot. Se on sekä tulo- että lähtö -iteraattorin yhdistelmä.

eteenpäin

Välistäminen lisäys tasa -arvo

Kaksisuuntaiset iteraattorit

Se voi liikkua molemmille suuntaan joko eteenpäin tai taaksepäin. Säiliöt, kuten List Set ja MultiMap, tukevat kaksisuuntaisia ​​iteraattoreita.

Listakarttasarja Multimap Multiset

Ylimmänkorotus/pienenemisen tasa -arvo

Satunnaiset pääsyn iteraattorit

Satunnaispääsy-iteraattorit ovat iteraattoreita, joita voidaan käyttää elementtien pääsyyn etäisyydellä elementistä, jonka he osoittavat saman toiminnallisuuden kuin osoittimet.

Vector Deque -ryhmä merkkijono

numpy linspace

Kaikki

Kuten olemme huomanneet yllä olevasta taulukosta, lukuun ottamatta tulo- ja lähtö -iteraattoreita Kun menemme taulukkoon, iteraattorityyppi sisältää yllä olevan iteraattorin ominaisuudet ja joidenkin uusien ominaisuuksien kanssa.

Iteraattorisovittimet

C ++: n iteraattorisovittimet ovat erityisiä iteraattoreita, jotka on rakennettu perinteisiin iteraattoreihin erikoistuneiden toimintojen tarjoamiseksi. C ++: ssa on monia iteraattorisovittimia, joista osa on annettu alla:

Iteraattorisovittimet tyyppi

Kuvaus

Käänteinen iteraattori

Käänteinen iteraattori on rakennettu kaksisuuntaisesti tai enemmän käyttäjän tyyppiä ja antaa käyttäjille mahdollisuuden kulkea säiliön käänteiseen suuntaan.

Virta iteraattorit

Stream -iteraattorit nimittäin ja Ostream Iteraattorit on rakennettu vastaavasti tulo- ja lähtö -iteraattoreille. Nämä iteraattorit antavat käyttäjille mahdollisuuden käyttää streameja säilöinä.

Siirrä iteraattoreita

Siirrä -iteraattoreita käytetään ottamaan käyttöön STL -algoritmien siirto -semantiikka. Muutto -iteraattorit siirtävät kopioitujen säilötietojen omistuksen kopiointiastiaan luomatta ylimääräisiä kopioita.

Asettajan iteraattori

Insertor -iteraattorien avulla voit asettaa annetut elementit johonkin asentoon säiliössä. C ++: ssa on kolme insertorin iteraattoria:

  1. back_insert_iterator: Lisää säiliön takaosaan.
  2. front_insert_iterator: Lisää säiliön etuosaan.
  3. insert_iteraattori: Lisää mihin tahansa säiliöön.

Nämä iteraattorit voidaan luoda käyttämällä back_inserter () front_inserter () insertti () toiminnot C ++: ssa.

Iterator -apuohjelmatoiminnot C ++: ssa

C ++ STL tarjoaa erilaisen toiminnon iteraattorien kanssa toiminnan yksinkertaistamiseksi. Ne on lueteltu alla olevassa taulukossa:

Funktio Kuvaus Syntaksi
STD :: etukäteen Edistää iteraattoria tietyllä määrällä paikkoja. edistää ( se n -A
STD :: Seuraava Palauttaa iteraattorin, joka on määritetty määrä paikkoja ennen tietyn iteraattorin. seuraava ( se n -A
STD :: PREST Palauttaa iteraattorin, joka on määritetty määrä paikkoja tietyn iteraattorin takana. eversti ( se n -A
STD :: Etäisyys Palauttaa kahden iteraattorin välisten elementtien lukumäärän. etäisyys ( it1 it2 -A
STD :: AloitaPalauttaa iteraattorin annetun säiliön ensimmäiseen elementtiin. alkaa ( astia -A
STD :: LOPPUPalauttaa iteraattorin elementtiin annetun säiliön viimeisen elementin jälkeen. loppu ( astia -A
std :: rbeginPalauttaa käänteisen iteraattorin annetun säiliön viimeiseen elementtiin. rbegin ( astia -A
STD :: RendPalauttaa käänteisen iteraattorin elementtiin, joka edeltää annetun säiliön ensimmäistä elementtiä. tehdä ( astia -A
STD :: Siserter Luo insertin iteraattorin, joka lisää elementit säiliöön tietyllä sijainnilla. syöttö ( säiliöasento -A
std :: back_inserter Luo takaosan insertin iteraattorin, joka lisää elementtejä säiliön loppuun. back_inserter ( astia -A
std :: front_inserter Luo etuosan insertin iteraattorin, joka lisää elementit säiliön etuosaan. front_inserter ( astia -A

Iteraattorien sovellukset esimerkeillä

Iteraattoreita käytetään laajasti C ++: ssa moniin erilaisiin tarkoituksiin työskennellessään STL -säiliöiden ja algoritmien kanssa. Seuraavassa on joitain iteraattoreiden ensisijaisia ​​sovelluksia C ++: ssa, jotka heidän koodiesimerkit:

Konttien kuljettaminen

STL -säiliöiden kulkeminen on iteraattoreiden perussuojain. Tässä käytämme aloitus- () ja end () -toimintoja saadaksesi aloitus- ja lopettajat koko säiliön kulkemiseen. Pohjimmiltaan lisäämme aloitus -iteraattoria, kunnes se ei ole yhtä suuri kuin loppu.

Esimerkki

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

Tulos
10 20 30 40 50 

Kuten yllä olevassa koodissa esitetään, kuljemme asetetun säiliön. Samoin voimme käyttää samaa lähestymistapaa minkä tahansa säiliön kulkemiseen.

Kontin kääntäminen

Käänteisten iteraattorien avulla voit kulkea säiliön päästä alkuun ilman, että tarvitset kääntää manuaalisesti.

Esimerkki

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

Tulos
50 40 30 20 10 

Säiliöistä riippumattomat algoritmit

Iteraattorit sallivat algoritmien työskennellä minkä tahansa konttityypin valmistustoimintojen kanssa, kuten std :: sort () std :: find () ja std :: for_each () joustavampi. Voit ohittaa iteraattorit todellisen säiliön sijasta.

Esimerkki

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

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

Iteraattoreiden lisäsovelluksia

STL -iteraattoreissa on enemmän sovelluksia:

  • Etäisyyslaskelma: STD :: Etäisyys () -iteraattorit auttavat laskemaan kahden asennon välisten elementtien lukumäärä säiliössä.
  • Virta iteraatio: Stream iteraattorien avulla voit hoitaa syöttö-/lähtövirtoja, kuten säiliöitä, mikä helpottaa lukemista ja kirjoittaa streameihin STL -algoritmien avulla.
  • Siirrä semantiikkaa STL -algoritmeissa: Siirrä iteraattorit tuovat STL -algoritmien siirto -semantiikan, mikä auttaa lisäämään suorituskykyä ja tehokkuutta välttämällä tarpeetonta kopiointia. Tietoja siirretään siirron semantiikan sääntöjen mukaisesti.
  • Mukautetut tietorakenteet: Mukautetut iteraattorit voidaan toteuttaa ei-STL-tietorakenteisiin, kuten puihin tai kaavioihin, jotta saadaan tukea STL-algoritmeille ja monille muille ominaisuuksille. Saatamme joutua noudattamaan muutamaa sääntöä ja yleissopimusta, jotta saadaan asianmukainen väheneminen ja muut operaatiot.