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:
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 :: Aloita | Palauttaa iteraattorin annetun säiliön ensimmäiseen elementtiin. | alkaa ( astia -A |
| STD :: LOPPU | Palauttaa iteraattorin elementtiin annetun säiliön viimeisen elementin jälkeen. | loppu ( astia -A |
| std :: rbegin | Palauttaa käänteisen iteraattorin annetun säiliön viimeiseen elementtiin. | rbegin ( astia -A |
| STD :: Rend | Palauttaa 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.