Egy iterátor c ++ -ban egy mutatószerű objektum, amely az STL-tartály egyik elemére mutat. Általában az STL -tartály tartalmának áthurlására használják a C ++ -ban. Az STL iterátorok fő előnye, hogy az STL algoritmusokat függetlenné teszik a használt konténer típusától. Az iterátort csak a konténer helyett átadhatjuk a konténer elemeknek az STL algoritmusokhoz.
Iterátor nyilatkozat
A C ++ STL minden tartályának megvan a saját iterátora. Tehát az iterátort úgy kell kijelölnünk, hogy:
C++
<type>::iterator it;
ahol
- Típus: A konténer típusa, amelyre az iterátort deklarálják.
- azt: Az iterator objektumhoz rendelt név.
Ezután inicializálhatjuk egy érvényes iterátor hozzárendelésével. Ha már van egy iterátorunk, amelyet a Delcaration idején kell kiosztani, akkor a típusnyilatkozatot kihagyhatjuk a autó Kulcsszó.
C++auto it = iter
ahol iter az újonnan létrehozott IT iteratorhoz rendelt iterátor.
A miénk C ++ tanfolyam Fedezi az iterátorok használatát az STL -ben, biztosítva, hogy megértse, hogyan kell átjutni a különböző konténertípusokhoz.
Példa az iterátorokra
Az alábbi program azt szemlélteti, hogyan lehet az iterátort használni a vektor tartály áthaladására:
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; }
Kibocsátás
1 2 3 4 5
Mint talán észrevetted, használtuk Vektor :: Begin () és Vector :: End () funkció. Ezek a funkciók az STD :: vektor tagfunkciói, amelyek az iterátort az első és egy elemre adják vissza a vektor utolsó eleme után. Az iterátorok visszatérését használjuk, ezeknek a funkcióknak a vektorok iterálásához.
Konténer iterátor funkciók
A C ++ STL néhány tagfunkciót biztosít STL konténer Ez visszatér az iterátorokhoz legalább az első és az utolsó elemhez. Ezeket a tagfunkciókat szinte az összes STL -tartályban definiálják (hagyva néhány korlátozott hozzáférési tartályt, mint például halom sor ) Ugyanazzal a névvel a konzisztencia érdekében.
Az alábbi táblázat felsorolja az összes olyan módszert, amely az iterátort visszaadja a konténerekbe:
Iterátor funkció | Visszatérési érték |
|---|---|
kezdődik() | Visszaad egy iterátort a konténer elejére. |
vége () | Visszaad egy iterátort az elméleti elemhez, közvetlenül a tartály utolsó eleme után. |
cbegin () | Állandó iterátort ad vissza a konténer elejére. Az állandó iterátor nem tudja módosítani annak a elemnek az értékét, amelyre mutat. |
néhány() bash olvasási fájl | Állandó iterátort ad vissza az elméleti elemhez, közvetlenül a tartály utolsó eleme után. |
rbegin () | Visszaad egy fordított iterátort a konténer elejére. |
render () | Visszatér egy fordított iterátort az elméleti elemhez, közvetlenül a tartály utolsó eleme után. |
crbegin () | Állandó fordított iterátort ad vissza a tartály kezdetére. |
Crend () | Egy állandó fordított iterátort ad vissza az elméleti elemhez, közvetlenül a tartály utolsó eleme után. |
Például, ha egy dolog a vektor neve, akkor a fenti módszereket az alábbiak szerint használhatjuk:
C++vec.begin() vec.rbegin() vec.cbegin() vec.crbegin() vec.end() vec.rend() vec.cend() vec.crend()
Iterátorok műveletei
Csakúgy, mint a mutató aritmetika, vannak olyan műveletek, amelyek megengedettek a C ++ iterátorokon. Olyan funkciók biztosítására szolgálnak, amelyek növelik az iterátorok fontosságát. 5 érvényes van iterator műveletek C ++ -ban :
- Dereferencia iterátorok
- Az iterátorok növelése/csökkentése
- Az egész szám hozzáadása/kivonása az iterátorokhoz
- Egy másik iterátor kivonása
- Az iterátorok összehasonlítása
Dereferencia iterátorok
A Dereferencing művelet lehetővé teszi a felhasználók számára hozzáférés vagy frissítés Az iterátor által mutatott elem értéke. A (*) indirekációs operátor A Dereference iterátorokhoz, akárcsak a mutatók.
C++// Access *it; // Update *it = new_val;
ahol New_val az iterátor által mutatott elemhez rendelt új érték azt -
Az iterátorok növelése/csökkentése
Az iterátort 1 -vel növelhetjük vagy csökkenthetjük (++) vagy (-) operátorok illetőleg. A növekedés művelete az iterátort a tartály következő elemére mozgatja, míg a csökkentési művelet az iterátort az előző elemre mozgatja.
C++it++; // post-increment ++it; // pre-increment it--; // post-decrement --it; // pre-decrement
Az egész szám hozzáadása/kivonása az iterátorokhoz
Felvehetünk vagy kivonhatunk egy egész értéket az iterátorokból. Ez inkább az iterátort a következő vagy az előző pozícióhoz a hozzáadott egész értéknek megfelelően fogja elérni.
C++// Addition it + int_val; // Subtraction it - int_val;
ahol int_val az egész értékek, amelyeket hozzáadnak vagy kivonnak az iterátorból azt -
Egy másik iterátor kivonása
Kivonhatjuk az egyik iterátort a másikból, hogy megtaláljuk a távolságot (vagy az elemek számát) a memória között.
C++it1 - it2
Az iterátorok összehasonlítása
Megpróbálhatjuk az azonos típusú két iterátort egymással szemben, hogy megtaláljuk a kapcsolatot közöttük. Használhatjuk azokat a relációs operátorokat, mint a (==) egyenlőség és (! =) Egyenlőtlenség -operátorok, valamint más relációs operátorok, például< > <= >=.
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
Az iterátorok típusai C ++ -ban
Az STL iterátorok feloszthatók a rajtuk végrehajtható műveletek alapján. A C ++ -ban 5 fő iterátor létezik, amelyek az alábbi táblázatban felsoroltak, a támogatott konténerekkel és a támogatott iterátor műveletekkel együtt.
Iterátor | Leírás | Támogatott konténerek | Támogatott műveletek |
|---|---|---|---|
Bemeneti iterátor | Ez egyirányú iterátor, amelyet az értékek olvasására használnak. | Bemeneti adatfolyam | Dereferencia növekedés egyenlőség |
Kimeneti iterátor | Ez egyirányú iterátor is, de az értékek hozzárendelésére szolgál. Nem fér hozzá az értékekhez. | Kimeneti adatfolyam | Dereferencia (csak írás) növekedés |
Előremenő iterátorok | Hozzáférhet és hozzárendelheti az értékeket. Ez a bemeneti és a kimeneti iterátor kombinációja. | FORRED_LIST UNSERVED_MAP UNDRANDED_SET | Dereferencia növekedés egyenlőség |
Kétirányú iterátorok | Mindkét irányba mozoghat előre vagy hátra. Az olyan konténerek, mint a listakészlet és a multimap, támogatják a kétirányú iterátorokat. | Lista Térkép beállítása multimap multiset | Dereferencia növekedés/csökkentés egyenlőség |
Véletlenszerű hozzáférés iterátorok | A véletlenszerű hozzáférés iterátorok olyan iterátorok, amelyek felhasználhatók az elemekhez való hozzáféréshez az elemtől, amelyre mutatnak, hogy ugyanazt a funkciót kínálják, mint a mutatók. | vektoros deque tömb karakterlánc git állapot | Minden |
Mint a fenti táblázatból észrevettük, a bemeneti és a kimeneti iterátoroktól eltekintve Amint lemenünk az asztalon, az iterátor típus a fenti iterátor tulajdonságait, valamint néhány új funkciót tartalmaz.
Iterátor adapterek
Az iterator adapterek a C ++ -ban a speciális iterátorok típusa, amelyet a hagyományos iterátorok fölé építettek, hogy speciális funkcionalitást biztosítsanak. A C ++ -ban sok iterator adapter található, amelyek közül néhányat az alábbiakban találunk:
Iterator adapterek típusa | Leírás |
|---|---|
Fordított iterátor | A fordított iterátort kétirányú vagy feletti operátor típusra építik fel, és lehetővé teszi a felhasználók számára, hogy fordított irányban áthaladjanak a tartályon. |
Patak iterátorok | A stream iterátorok, nevezetesen az ISTREAM és az Osztream iterátorok a bemeneti és a kimeneti iterátorokra épülnek. Ezek az iterátorok lehetővé teszik a felhasználók számára, hogy a patakokat konténerekként használják. |
Mozgassa az iterátorokat | A MOVE iterators segítségével a MOVE szemantika bevezetésére szolgál az STL algoritmusokban. A MOVE iterátorok a másolt konténeradatok tulajdonjogát a másoló tartályba mozgatják, anélkül, hogy az extra példányokat létrehoznák. |
Beillesztő iterátor | A beillesztési iterátorok lehetővé teszik, hogy a megadott elemeket a tartály valamilyen helyzetébe helyezze. Három beillesztési iterátor van a C ++ -ban:
Ezek az iterátorok felhasználhatók back_inserter () Front_inserter () beillesztés () Funkciók a C ++ -ban. |
Iterator hasznossági funkciók a C ++ -ban
A C ++ STL biztosítja a különféle funkciót az iterátorokkal való munka egyszerűsítéséhez. Az alábbi táblázatban vannak felsorolva:
| Funkció | Leírás | Szintaxis |
|---|---|---|
| STD :: Advance | Az iterátort egy meghatározott számú pozícióval továbbítja. | előleg ( it n ) |
| STD :: Next | Visszaadja az iterátort, amely meghatározott számú pozíciót jelent az adott iterátor előtt. | következő ( it n ) |
| STD :: Prev | Visszaadja az iterátort, amely meghatározott számú pozíciót jelent az adott iterátor mögött. | előző ( it n ) |
| std :: távolság | Visszaadja a két iterátor közötti elemek számát. | távolság ( it1 it2 ) |
| STD :: Begin | Visszaad egy iterátort az adott konténer első eleméhez. | kezdődik ( tartály ) |
| STD :: End | Visszaad egy iterátort az elemhez az adott tartály utolsó elemét követve. | vége ( tartály ) |
| std :: rbegin | Visszaad egy fordított iterátort az adott konténer utolsó eleméhez. | rbegin ( tartály ) |
| STD :: REND | Visszaad egy fordított iterátort az elemhez, amely az adott konténer első elemét megelőzően megelőzi. | készít ( tartály ) |
| STD :: INSERTER | Létrehoz egy betét iterátort, amely az elemeket egy meghatározott helyzetben egy tartályba helyezi be. | beillő ( konténerhelyzet ) |
| STD :: Back_inserter | Készít egy hátsó betét iterátort, amely az elemeket a tartály végéhez csatolja. | back_inserter ( tartály ) |
| STD :: Front_inserter | Készít egy elülső betét iterátort, amely az elemeket egy tartály elejére illeszti. | Front_inserter ( tartály ) |
Iterátorok alkalmazása példákkal
Az iterátorokat széles körben használják a C ++ -ban, sokféle célra, miközben az STL konténerekkel és algoritmusokkal dolgoznak. Az alábbiakban bemutatjuk az iterátorok néhány elsődleges alkalmazását a C ++ -ban, amelyek kódpéldák:
Tartályok átjárása
Az STL konténerek áthaladása az iterátorok legalapvetőbb alkalmazása. Ebben a Begin () és a End () funkciókat használjuk a kezdet és a vége iterátorok eléréséhez, hogy áthaladjanak az egész tartályon. Alapvetően folyamatosan növeljük a Begin iteratort, amíg az nem egyenlő a végével.
Példa
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; }
Kibocsátás
10 20 30 40 50
Amint a fenti kódban látható, áthaladunk a beállított tárolón. Hasonlóképpen ugyanazt a megközelítést alkalmazhatjuk bármilyen tartály áthaladására.
A konténer megfordítása
A fordított iterátorok lehetővé teszik, hogy a tartályt a végétől a kezdetéig áthaladjanak anélkül, hogy a visszafordítás kézi kezelésére lenne szükség.
Példa
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; }
Kibocsátás
50 40 30 20 10
Konténerfüggetlen algoritmusok
Az iterátorok lehetővé teszik az algoritmusok számára, hogy bármilyen konténer típusú funkciókkal működjenek, mint például az STD :: sort () STD :: find () és az STD :: for_each () rugalmasabb. A tényleges konténer helyett átadhatja az iterátorokat.
Példa
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; }
Kibocsátás
10s in Vector: 2 10s in Multiset: 3
Az iterátorok kiegészítő alkalmazásai
Több alkalmazást alkalmaznak az STL iterátorok:
- Távolsági kiszámítás: Az STD :: Respice () iterátorok használata segít kiszámítani az elemek számát a konténer két pozíciója között.
- Patak iteráció: A patak iterátorok lehetővé teszik a bemeneti/kimeneti adatfolyamok, például a konténerek kezelését, így az STL algoritmusok segítségével megkönnyítik az olvasást és a streamek írását.
- Mozgassa a szemantikát az STL algoritmusokban: A MOVE iterators bemutatja a MOVE szemantikát az STL algoritmusokban, amelyek elősegítik a teljesítmény és a hatékonyság növelését azáltal, hogy elkerülik a felesleges másolást. Az adatokat a mozgási szemantika szabályai szerint továbbítják.
- Egyedi iterátorok az adatszerkezetekhez: Az egyéni iterátorok olyan nem-STL adatszerkezetekhez valósíthatók meg, mint a fák vagy grafikonok, hogy támogassák az STL algoritmusokat és sok más funkciót. Lehet, hogy be kell tartanunk néhány szabályt és konvenciót, hogy a csökkentés és más műveletek megfelelő növekedése érdekében biztosítsuk.