logo

Iteratorer i C ++ STL

En  Iterator i C ++  er et markørlignende objekt, der peger på et element i STL-beholderen. De bruges generelt til at slukke gennem indholdet af STL -beholderen i C ++. Den største fordel ved STL -iteratorer er, at de gør STL -algoritmerne uafhængige af den anvendte container. Vi kan bare videregive iteratoren til containerelementerne i stedet for containeren selv til STL -algoritmerne.

Iterator -erklæring

Hver container i C ++ STL har sin egen iterator. Så vi er nødt til at erklære en iterator som:



C++
<type>::iterator it; 

hvor

  • type: Type container, som iteratoren er erklæret for.
  • det: Navn tildelt iteratorobjekt.

Vi kan derefter initialisere det ved at tildele en gyldig iterator. Hvis vi allerede har en iterator, der skal tildeles på tidspunktet for delcaration, kan vi springe over typen ved hjælp af Auto nøgleord.

C++
auto it = iter 

hvor iter er iteratoren tildelt den nyoprettede it -iterator.



Vores C ++ kursus Dækker brugen af ​​iteratorer i STL, hvilket sikrer, at du forstår, hvordan du krydser forskellige contaertyper.

Eksempel på iteratorer

Nedenstående program illustrerer, hvordan man bruger iteratoren til at krydse vektorbeholderen:

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

Produktion
1 2 3 4 5 

Som du måske har bemærket, at vi har brugt Vector :: Begin () og Vector :: END () fungere. Disse funktioner er medlemsfunktionerne til std :: vektor, der returnerer iteratoren til det første og det ene element efter det sidste element i vektoren. Vi bruger iteratorerne returnerer være disse funktioner til at iterere vektorerne.



Container -iteratorfunktioner

C ++ STL leverer nogle medlemsfunktioner i STL -container Det returnerer iteratorerne til mindst det første og det sidste element. Disse medlemsfunktioner er defineret i næsten hele STL -containeren (efterlader nogle begrænsede adgangscontainere som stak ) med samme navn for konsistens.

Følgende tabel viser alle metoder, der returnerer iteratoren til containerne:

Iteratorfunktion

Returværdi

begynde()

Returnerer en iterator til begyndelsen af ​​beholderen.

ende()

Returnerer en iterator til det teoretiske element lige efter det sidste element i beholderen.

cbegin ()

Returnerer en konstant iterator til begyndelsen af ​​beholderen. En konstant iterator kan ikke ændre værdien af ​​det element, den peger på.

nogle få ()

singleton design mønster java

Returnerer en konstant iterator til det teoretiske element lige efter det sidste element i beholderen.

rbegin ()

Returnerer en omvendt iterator til begyndelsen af ​​beholderen.

render ()

Returnerer en omvendt iterator til det teoretiske element lige efter det sidste element i beholderen.

crbegin ()

Returnerer en konstant omvendt iterator til begyndelsen af ​​beholderen.

Crend ()

Returnerer en konstant omvendt iterator til det teoretiske element lige efter det sidste element i beholderen.

For eksempel hvis En ting er navnet på vektoren, så kan vi bruge ovenstående metoder som vist nedenfor:

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

Iterators operationer

Ligesom markøraritmetik er der nogle operationer, der er tilladt på C ++ iteratorer. De bruges til at give forskellige funktionaliteter, der øger iteratorens betydning. Der er 5 gyldige Iteratoroperationer i C ++ :

  • Derferencing iterators
  • Forøgelse/dekrementerende iteratorer
  • Tilføjelse/subtraktion af heltal til iteratorer
  • Trækker en anden iterator
  • Sammenligning af iteratorer

Derferencing iterators

Dererencing -operation giver brugerne mulighed for at adgang eller opdatering Værdien af ​​det element, der er peget af iteratoren. Vi bruger (*) Indirekte operatør til derferens iteratorer ligesom pointers.

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

hvor New_Val er den nye værdi, der er tildelt det element, der er peget af iterator det .

Forøgelse/dekrementerende iteratorer

Vi kan øge eller reducere iteratoren med 1 ved hjælp af (++) eller (-) operatører henholdsvis. Forøgelsesoperation flytter iteratoren til det næste element i beholderen, mens dekrementoperationen flytter iteratoren til det forrige element.

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

Tilføjelse/subtraktion af heltal til iteratorer

Vi kan også tilføje eller trække en heltalværdi fra iteratorerne. Det vil mere iteratoren næste eller tidligere position i henhold til den ekstra heltalværdi.

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

hvor INT_VAL er heltalværdierne, der tilføjes eller trækkes fra iteratoren det .

Trækker en anden iterator

Vi kan trække en iterator fra en anden for at finde afstanden (eller antallet af elementer) mellem den hukommelse, de peger på.

C++
it1 - it2 

Sammenligning af iteratorer

Vi kan også teste de to iteratorer af samme type mod hinanden for at finde forholdet mellem dem. Vi kan bruge de relationelle operatører som (==) ligestilling og (! =) Ulighedsoperatører sammen med andre relationelle operatører, såsom< > <= >=.

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 

Typer af iteratorer i C ++

STL iteratorer kan opdeles på grundlag af de operationer, der kan udføres på dem. Der er 5 hovedtyper af iteratorer i C ++, som som anført i nedenstående tabel sammen med understøttede containere og understøttede iteratoroperationer.

Iterator

Beskrivelse

Understøttede containere

Understøttede operationer

Input iterator

Det er en envejs-iterator, der bruges til at læse værdierne.

Inputstrøm

Dereferencing forøgelse af ligestilling

Output Iterator

Det er også en envejs-iterator, men bruges til at tildele værdierne. Det kan ikke få adgang til værdierne.

Output Stream

Derferencing (kun skriv) forøgelse

Videresende iteratorer

Det kan få adgang til og tildele værdierne. Det er kombinationen af ​​både input- og output -iterator.

Forward_list Unordered_map uordnet_set

Dereferencing forøgelse af ligestilling

Bidirektionelle iteratorer

Det kan bevæge sig i både retning enten i fremad eller bagud. Containerne som listesæt og multimap understøtter tovejs -iteratorer.

Liste kort sæt multimap multiset

Derferencing forøgelse/reduktionsligestilling

Tilfældig adgangs -iteratorer

Iteratorer til tilfældig adgang er iteratorer, der kan bruges til at få adgang til elementer i afstand fra det element, de peger på at tilbyde den samme funktionalitet som pointer.

Vector Deque Array String

software test

Alle

Som vi måske har bemærket fra ovenstående tabel bortset fra input- og output -iteratorerne Når vi går ned på bordet, indeholder iteratortypen funktionerne på ovenstående iterator sammen med nogle nye funktioner.

Iteratoradaptere

Iteratoradaptere i C ++ er den specielle type iteratorer, der er bygget over traditionelle iteratorer til at give specialiseret funktionalitet. Der er mange iteratoradaptere i C ++, hvoraf nogle er angivet nedenfor:

Iteratoradaptere type

Beskrivelse

Vende iterator

Den omvendte iterator er bygget over tovej eller over type operatør og giver brugerne mulighed for at krydse beholderen i modsat retning.

Stream iteratorer

Stream -iteratorerne, nemlig IStream- og Ostream -iteratorer, er bygget på henholdsvis input- og output -iteratorerne. Disse iteratorer giver brugerne mulighed for at bruge vandløbene som containere.

Flyt iteratorer

Flyt iteratorer bruges til at introducere flytningssemantikken i STL -algoritmer. Flytnings -iteratorerne flytter ejerskabet af de kopierede containerdata til kopieringsbeholderen uden at oprette de ekstra kopier.

Inserter iterator

Insertor -iteratorerne giver dig mulighed for at indsætte de givne elementer i en position i beholderen. Der er tre insertor -iteratorer i C ++:

  1. Back_insert_iterator: Indsætter på bagsiden af ​​beholderen.
  2. front_insert_iterator: Indsatser foran på beholderen.
  3. insert_iterator: Indsættes overalt i beholderen.

Disse iteratorer kan oprettes ved hjælp af back_inserter () front_inserter () indsæt () Funktioner i C ++.

Iterator -værktøjsfunktioner i C ++

C ++ STL leverer de forskellige funktioner til at forenkle arbejdet med iteratorer. De er anført i nedenstående tabel:

Fungere Beskrivelse Syntaks
std :: fremskridt Fremskridt en iterator med et specifikt antal positioner. fremskridt ( det n )
std :: næste Returnerer iteratoren, der er et specificeret antal positioner foran den givne iterator. næste ( det n )
Std :: prev Returnerer iteratoren, der er et specificeret antal positioner bag den givne iterator. Forrige ( det n )
std :: afstand Returnerer antallet af elementer mellem to iteratorer. afstand ( it1 it2 )
std :: BegyndReturnerer en iterator til det første element i den givne beholder. begynde ( beholder )
std :: slutReturnerer en iterator til elementet efter det sidste element i den givne beholder. ende ( beholder )
std :: rbeginReturnerer en omvendt iterator til det sidste element i den givne beholder. rbegin ( beholder )
std :: rendReturnerer en omvendt iterator til elementet forud for det første element i den givne beholder. gør ( beholder )
std :: Inserter Opretter en INSERT -iterator, der indsætter elementer i en beholder i en specificeret position. Inserter ( containerposition )
std :: back_inserter Opretter en rygindsæt iterator, der tilføjer elementer til enden af ​​en beholder. Back_inserter ( beholder )
std :: front_inserter Opretter en frontindsats iterator, der indsætter elementer foran på en beholder. front_inserter ( beholder )

Anvendelser af iteratorer med eksempler

Iteratorer bruges i vid udstrækning i C ++ til mange forskellige formål, mens de arbejder med STL -containere og algoritmer. Følgende er nogle primære anvendelser af iteratorer i C ++, som deres kodeeksempler:

Krydse containere

Traversing STL -containere er den mest basale anvendelse af iteratorer. I dette bruger vi start () og slut () -funktionerne for at få start- og afsluttende iteratorer til at krydse hele beholderen. Grundlæggende fortsætter vi med at øge begyndelsen af ​​iteratoren, indtil den ikke er lig med slutningen.

Eksempel

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

Produktion
10 20 30 40 50 

Som vist i koden ovenfor krydser vi sætcontaineren. Tilsvarende kan vi bruge den samme tilgang til at krydse enhver beholder.

Vende en beholder

Omvendt iteratorer giver dig mulighed for at krydse en container fra slutningen til begyndelsen uden at skulle manuelt håndtere reverseringen.

Eksempel

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

Produktion
50 40 30 20 10 

Containeruafhængige algoritmer

Iteratorer tillader algoritmer at arbejde med enhver contaertype -funktionsfunktioner som std :: sortering () std :: find () og std :: for_each () mere fleksibel. Du kan passere iteratorer i stedet for den faktiske beholder.

Eksempel

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

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

Yderligere anvendelser af iteratorer

Der er flere anvendelser af STL -iteratorer:

  • Afstandsberegning: Brug af std :: afstand () iteratorer hjælper med at beregne antallet af elementer mellem to positioner i en container.
  • Stream iteration: Stream iteratorer giver dig mulighed for at behandle input/outputstrømme som containere, hvilket gør det lettere at læse fra og skrive til streams ved hjælp af STL -algoritmer.
  • Flyt semantik i STL -algoritmer: Flyt iteratorer introducerer Move Semantics i STL -algoritmer, som hjælper med at øge ydeevnen og effektiviteten ved at undgå unødvendig kopiering. Dataene flyttes i henhold til reglerne for Move Semantics.
  • Brugerdefinerede iteratorer til datastrukturer: Brugerdefinerede iteratorer kan implementeres til ikke-STL-datastrukturer som træer eller grafer for at yde støtte til STL-algoritmer og mange andre funktioner. Vi er muligvis nødt til at følge et par sæt regler og konventioner for at give ordentlig forøgelse af dekrementering og andre operationer.