logo

Iteratorer i C ++ STL

En  iterator i C ++  är ett pekarliknande objekt som pekar på ett element i STL-behållaren. De används vanligtvis för att slinga genom innehållet i STL -behållaren i C ++. Den största fördelen med STL -iteratorer är att de gör STL -algoritmerna oberoende av den typ av behållare som används. Vi kan bara skicka iteratorn till behållarelementen istället för behållaren själv till STL -algoritmerna.

Iteratordeklaration

Varje behållare i C ++ STL har sin egen iterator. Så vi måste förklara en iterator som:



C++
<type>::iterator it; 

där

  • typ: Typ av behållare för vilken iteratorn förklaras.
  • det: Namn tilldelat iteratorobjekt.

Vi kan sedan initialisera det genom att tilldela en del giltiga iterator. Om vi ​​redan har en iterator som ska tilldelas vid delningstillfället kan vi hoppa över typdeklarationen med hjälp av bil nyckelord.

C++
auto it = iter 

där iter är iteratorn tilldelad den nyligen skapade ITerator.



Vår C ++ kurs Täcker användningen av iteratorer i STL och säkerställer att du förstår hur du kan korsa olika containertyper.

Exempel på iteratorer

Nedanstående program illustrerar hur man använder iteratorn för att korsa vektorbehållaren:

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 kanske har märkt att vi har använt Vector :: Begin () och Vector :: End () fungera. Dessa funktioner är medlemsfunktionerna till std :: vektor som returnerar iteratorn till det första och ett element efter det sista elementet i vektorn. Vi använder iterators retur är dessa funktioner för att iterera vektorerna.



Container iteratorfunktioner

C ++ STL tillhandahåller vissa medlemsfunktioner i STL -behållare som returnerar iteratorerna till åtminstone det första och det sista elementet. Dessa medlemsfunktioner definieras i nästan hela STL -behållaren (lämnar några begränsade åtkomstbehållare som stack ) med samma namn för konsistens.

Följande tabell visar alla metoder som returnerar iteratorn till containrarna:

Iteratorfunktion

Returvärde

börja()

Returnerar en iterator till början av containern.

avsluta()

Returnerar en iterator till det teoretiska elementet strax efter det sista elementet i behållaren.

cbegin ()

Returnerar en konstant iterator till början av containern. En konstant iterator kan inte ändra värdet på det element det pekar på.

några få()

armstrong nummer

Returnerar en konstant iterator till det teoretiska elementet strax efter det sista elementet i behållaren.

rbegin ()

Returnerar en omvänd iterator till början av containern.

göra()

Returnerar en omvänd iterator till det teoretiska elementet strax efter det sista elementet i behållaren.

crbegin ()

Returnerar en konstant omvänd iterator till början av containern.

Crend ()

Returnerar en konstant omvänd iterator till det teoretiska elementet strax efter det sista elementet i behållaren.

Till exempel om en sak är namnet på vektorn då kan vi använda ovanstående metoder som visas nedan:

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

Iteratorsoperationer

Precis som pekararitmetik finns det vissa operationer som är tillåtna på C ++ iteratorer. De används för att tillhandahålla olika funktionaliteter som ökar Iterators betydelse. Det finns 5 giltiga iteratoroperationer i C ++ :

  • Avlägsna iteratorer
  • Öka/minska iteratorer
  • Lägga till/subtrahera heltal till iteratorer
  • Subtrahera en annan iterator
  • Jämförelse av iteratorer

Avlägsna iteratorer

Dereferencing -drift gör det möjligt för användarna att åtkomst eller uppdatering Värdet på elementet pekas av iteratorn. Vi använder (*) indirektör till dereference iterators precis som pekare.

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

där new_val är det nya värdet som tilldelats det element som pekas av iterator det .

Öka/minska iteratorer

Vi kan öka eller minska iteratorn med 1 med (++) eller (-) operatörer respektive. Ökningsoperation flyttar iteratorn till nästa element i behållaren medan minskningsoperationen flyttar iteratorn till föregående element.

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

Lägga till/subtrahera heltal till iteratorer

Vi kan också lägga till eller subtrahera ett heltal från iteratorerna. Det kommer mer att iteratorn nästa eller tidigare position enligt det extra heltalsvärdet.

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

där int_val är heltalsvärdena som läggs till eller subtraheras från iteratorn det .

Subtrahera en annan iterator

Vi kan subtrahera en iterator från en annan för att hitta avståndet (eller antalet element) mellan minnet de pekar på.

C++
it1 - it2 

Jämförelse av iteratorer

Vi kan också testa de två iteratorerna av samma typ mot varandra för att hitta förhållandet mellan dem. Vi kan använda de relationella operatörerna som (==) jämlikhet och (! =) Ojämlikhetsoperatörer tillsammans med andra relationella operatörer 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 av iteratorer i C ++

STL -iteratorer kan delas ut på grundval av de operationer som kan utföras på dem. Det finns 5 huvudtyper av iteratorer i C ++ som som anges i tabellen nedan tillsammans med stödda containrar och stödda iteratoroperationer.

Iterator

Beskrivning

Stöttade containrar

Stödda operationer

Inmatning

Det är en enkelriktad iterator som används för att läsa värdena.

Inmatningsström

Jämställdhet

Utgångs iterator

Det är också en enkelriktad iterator men används för att tilldela värdena. Det kan inte komma åt värdena.

Produktionsström

Dereferencing (endast skriv) inkrement

Framåt iteratorer

Det kan komma åt och tilldela värdena. Det är kombinationen av både ingångs- och utgångs -iterator.

Forward_List Unordered_map Unordered_set

Jämställdhet

Dubbelriktade iteratorer

Det kan röra sig i båda riktningarna antingen i framåt eller bakåt. Behållare som listuppsättning och multimap stöder dubbelriktade iteratorer.

Listkarta Set MultiMap Multiset

Jämställdhet av avskaffande/minskning

Slumpmässig åtkomst iteratorer

Slumpmässiga åtkomst iteratorer är iteratorer som kan användas för att komma åt element på avstånd från elementet de pekar på att erbjuda samma funktionalitet som pekare.

vektor deque array sträng

operatörer inom python-programmering

Alla

Som vi kanske har lagt märke till från ovanstående tabell bortsett från inmatnings- och utgångs -iteratorerna När vi går ner i tabellen innehåller iteratortypen funktionerna hos ovan iterator tillsammans med några nya funktioner.

Iteratoradaptrar

Iteratoradaptrar i C ++ är den speciella typen av iteratorer som är byggda över traditionella iteratorer för att tillhandahålla specialiserad funktionalitet. Det finns många iteratoradaptrar i C ++ av vilka några ges nedan:

Iterator adaptrar typ

Beskrivning

Omvänd iterator

Den omvända iteratorn är byggd över dubbelriktad eller över typen av operatör och gör det möjligt för användare att korsa behållaren i omvänd riktning.

Strömma iteratorer

Strömma iteratorerna, nämligen Istream och Ostream iterators, byggs på ingångs- och utgångs -iteratorerna. Dessa iteratorer tillåter användarna att använda strömmarna som containrar.

Flytta iteratorer

Flytta iteratorer används för att introducera flyttsemantiken i STL -algoritmer. Flytten iteratorer flyttar ägandet av den kopierade containordata till kopieringsbehållaren utan att skapa de extra kopiorna.

Infästariterator

Insertor -iteratorerna låter dig infoga de givna elementen på någon position i behållaren. Det finns tre insertor -iteratorer i C ++:

  1. Back_Insert_Iterator: Insatser på baksidan av behållaren.
  2. front_insert_iterator: Insatser framför behållaren.
  3. insert_iterator: Insatser på var som helst i behållaren.

Dessa iteratorer kan skapas med Back_Inserter () Front_Inserter () infoga() Funktioner i C ++.

Iteratorverktygsfunktioner i C ++

C ++ STL tillhandahåller de olika funktionerna för att förenkla arbetet med iteratorer. De är listade i tabellen nedan:

Fungera Beskrivning Syntax
Std :: Advance Framför en iterator med ett specifikt antal positioner. förskott ( det n )
std :: nästa Returnerar iteratorn som är ett specifikt antal positioner före den givna iteratorn. nästa ( det n )
Std :: föregående Returnerar iteratorn som är ett specifikt antal positioner bakom den givna iteratorn. föregångare ( det n )
std :: avstånd Returnerar antalet element mellan två iteratorer. avstånd ( it1 it2 )
std :: BörjaReturnerar en iterator till det första elementet i den givna behållaren. börja ( behållare )
std :: EndReturnerar en iterator till elementet efter det sista elementet i den givna behållaren. avsluta ( behållare )
std :: rbeginReturnerar en omvänd iterator till det sista elementet i den givna behållaren. rbegin ( behållare )
std :: RENDReturnerar en omvänd iterator till elementet före det första elementet i den givna behållaren. märke ( behållare )
std :: infästare Skapar en insats iterator som sätter in element i en behållare i en viss position. insats ( behållarposition )
std :: back_inserter Skapar en rygginsats iterator som lägger till element till slutet av en behållare. Back_Inserter ( behållare )
std :: front_inserter Skapar en frontinsats iterator som sätter in element framför en behållare. front_Inserter ( behållare )

Applikationer av iteratorer med exempel

Iteratorer används i stor utsträckning i C ++ för många olika ändamål medan du arbetar med STL -containrar och algoritmer. Följande är några primära tillämpningar av iteratorer i C ++ som deras kodexempel:

Korsande containrar

Att korsa STL -containrar är den mest grundläggande tillämpningen av iteratorer. I detta använder vi funktioner för början () och slut () för att få start- och slut -iteratorer för att korsa hela behållaren. I grund och botten fortsätter vi att öka början iterator tills den inte är lika med slutet.

Exempel

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 visas i koden ovan korsar vi setbehållaren. På liknande sätt kan vi använda samma tillvägagångssätt för att korsa alla behållare.

Vänja en behållare

Omvända iteratorer låter dig korsa en behållare från slutet till början utan att behöva manuellt hantera vändningen.

Exempel

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 

Behållaroberoende algoritmer

Iterators tillåter algoritmer att arbeta med alla funktioner för containertyp som std :: sort () std :: find () och std :: for_each () mer flexibel. Du kan passera iteratorer istället för själva behållaren.

Exempel

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

Ytterligare tillämpningar av iteratorer

Det finns fler tillämpningar av STL -iteratorer:

  • Avståndsberäkning: Att använda std :: avstånd () iteratorer hjälper till att beräkna antalet element mellan två positioner i en behållare.
  • Strömma iteration: Strömma iteratorer låter dig behandla inmatnings-/utgångsströmmar som containrar som gör det lättare att läsa från och skriva till strömmar med STL -algoritmer.
  • Flytta semantik i STL -algoritmer: Move Iterators introducerar flyttsemantiken i STL -algoritmer som hjälper till att öka prestanda och effektivitet genom att undvika onödig kopiering. Uppgifterna kommer att flyttas enligt reglerna för Move Semantics.
  • Anpassade iteratorer för datastrukturer: Anpassade iteratorer kan implementeras för icke-STL-datastrukturer som träd eller grafer för att ge stöd för STL-algoritmer och många andra funktioner. Vi kan behöva följa några uppsättningar av regler och konventioner för att ge korrekt ökning av minskning och andra operationer.