iterators stl
Pełny przegląd iteratorów w STL.
W tym samouczku przyjrzymy się szczegółom iteratorów, ich typom, zaletom i różnym funkcjom, które obsługują.
implementacja wykresu w C ++
Co to jest Iterator? Ogólnie rzecz biorąc, iterator jest taki sam, jak każdy obiekt wskazujący na określony element w zakresie danych, na przykład tablicę lub kontener. Iterator jest podobny do wskaźnika w C.
=> Poszukaj całej serii szkoleń C ++ tutaj.
Czego się nauczysz:
Przegląd
W STL iterator to obiekt, którego można użyć do przechodzenia przez elementy w kontenerze lub przechodzenia przez nie za pomocą zestawu operatorów, takich jak operator przyrostu (++) lub operator wyłuskiwania (*).
Iteratory są kluczowe w programowaniu STL, ponieważ odgrywają ważną rolę w łączeniu algorytmów z kontenerem, oprócz uzyskiwania dostępu do danych przechowywanych w kontenerach i manipulowania nimi.
Rodzaje Iteratorów
W zależności od funkcjonalności implementowanej przez iteratory są one klasyfikowane w następujący sposób:
- Iteratory wejścia i wyjścia : To są najbardziej uproszczone typy iteratorów. Są najbardziej przydatne w sekwencyjnych operacjach wejścia-wyjścia zawierających pojedynczy przebieg.
- Iteratory do przodu : Są one podobne do iteratorów wejściowych, ale mają kierunek, tj. Kierunek do przodu w tym sensie, że mogą być używane do przechodzenia przez zakres w kierunku do przodu. Gdy iteratory do przodu nie są stałe, mogą być również używane jako iteratory wyjściowe. Większość standardowych kontenerów STL obsługuje przynajmniej iteratory do przodu.
- Dwukierunkowe Iteratory : Są one podobne do iteratorów do przodu z tą różnicą, że są dwukierunkowe. Oznacza to, że możemy używać tych dwukierunkowych iteratorów do przechodzenia przez zakres w kierunku do przodu i do tyłu.
- Iteratory o dostępie swobodnym : Iteratory o dostępie swobodnym są najpotężniejsze spośród wszystkich iteratorów. Są to niesekwencyjne iteratory. Iteratory o dostępie swobodnym pozwalają nam uzyskać dostęp do dowolnej wartości losowej przez zastosowanie przesunięcia do bieżącej wartości bez konieczności sekwencyjnego przechodzenia przez każdy element. Wykazują podobne właściwości jak wskaźniki w C.
Należy zauważyć, że nie wszystkie kontenery STL obsługują wszystkie iteratory. Różne kontenery obsługują różne iteratory w zależności od wymagań dotyczących ich funkcjonalności.
Poniżej znajduje się lista kontenerów, które używają różnych iteratorów:
Pojemniki | Iteratory |
---|---|
Mapa | Dwukierunkowy |
Stos | Brak iteratora |
Kolejka | Brak iteratora |
Kolejka priorytetowa | Brak iteratora |
Lista | Dwukierunkowy |
Wektor | Losowy dostęp |
i | Losowy dostęp |
Multimap | Dwukierunkowy |
Zestaw | Dwukierunkowy |
Multiset | Dwukierunkowy |
Zalety iteratorów
Iteratory są niezwykle przydatne, zwłaszcza podczas programowania przy użyciu różnych zakresów i kontenerów.
Niektóre zalety korzystania z iteratorów w programowaniu można podsumować poniżej:
1) Możliwość ponownego wykorzystania kodu
Tak długo, jak używamy iteratorów, aby uzyskać dostęp do elementów w naszym programie, możemy po prostu zmienić nazwę kontenera w naszej definicji iteratora i użyć pozostałej części kodu w podobny sposób, ilekroć musimy zmienić kontener.
Jest to szczególnie przydatne w scenariuszach, w których planujemy zastąpić kontener wektorowy za pomocą kontenera listy. Gdybyśmy zamiast iteratorów użyli operatora (), kod dostępu do elementów byłby bezużyteczny przy zmianie kontenerów.
# 2) Łatwość i wygoda programowania
Iteratory mają różne wbudowane funkcje, które pomagają nam w łatwym i wygodnym przechodzeniu i uzyskiwaniu dostępu do zawartości kontenera.
Na przykład , nie musimy ciągle sprawdzać końca listy lub tablicy, tak jak to robimy, używając operatorów () i musimy zmienić kod programu, tak jak wtedy, gdy chcemy dodać elementy, i musimy zmienić je na pętlę .
Korzystając z iteratorów, możemy uzyskać bezpośredni dostęp do funkcji begin () i end () iteratorów bez konieczności utrzymywania zakładki, gdy dojdziemy do końca listy, a także nie musimy zmieniać ich na pętlę.
# 3) Dynamiczne dodawanie / usuwanie
Korzystając z iteratorów, możemy łatwo i dynamicznie dodawać lub usuwać elementy w kontenerze bez konieczności przesuwania elementów, tak jak musimy to robić w operatorach ().
Zademonstrujmy to na następującym przykładzie:
#include #include using namespace std; int main() { vector vec1 = { 1, 1, 2 }; // Declaring an iterator vector::iterator i; // Inserting element for (i = vec1.begin(); i != vec1.end(); ++i) { if (i == vec1.begin()) { i = vec1.insert(i, 3); // insert 3 at the beginning of vec1 } } // contents of vec1 3 1 1 2 cout<<'Vector contents after addition'; cout< Wynik:
Zawartość wektorów po dodaniu
3 1 1 2
Zawartość wektora po usunięciu
3 1 2
Jak widać na powyższym przykładzie, widzimy, że za pomocą iteratorów możemy łatwo dodawać lub usuwać elementy z kontenera (w tym przypadku wektora), bez konieczności uciekania się do złożonego programowania przesuwania elementów i restrukturyzacji kontenera.
Funkcje iteracyjne
Ponieważ same iteratory są konstrukcjami wbudowanymi, obsługują one różne operacje, które można wykonać na obiektach iteratorów. Te operacje / funkcje pozwalają nam sprawnie przechodzić przez zasięg, a także manipulować elementami wewnątrz kontenera.
Teraz zobaczymy kilka głównych operacji obsługiwanych przez iteratory.
- zaczynać: Zwraca pierwszą lub początkową pozycję iteratora.
- koniec: Zwraca ostatnią pozycję lub pozycję „po zakończeniu” iteratora.
- prev: Zwraca nowy iterator po zmniejszeniu liczby pozycji podanej w argumencie.
- Kolejny: Zwraca nowy iterator po przesunięciu lub zwiększeniu liczby pozycji podanej w argumencie.
- inserter: Wstawia element w dowolnym miejscu w kontenerze.
- postęp: Zwiększa pozycję iteratora do określonej liczby podanej w argumencie.
Pokażemy użycie niektórych z tych funkcji / operacji w następującym programie:
#include #include #include using namespace std; int main() { vector v = { 1, 1,2,3,5 }; // declaring iterators to a vector vector::iterator itr1 = v.begin(); vector::iterator itr2 = v.end(); auto it = next(itr1, 2); // displaying iterator position cout << 'Using next() the new iterator is at: '; cout << *it << ' '; cout << endl; auto it1 = prev(itr2, 2); // displaying iterator position cout << 'The position of new iterator using prev() is: '; cout << *it1 << ' '; cout << endl; //advance advance(itr1,3); // displaying iterator position cout << 'After advance operation,itr1 is positioned at: '; cout << *itr1 << ' '; cout << endl; return 0; }
Wynik:
Używając next (), nowy iterator to: 2
Pozycja nowego iteratora używającego prev () to: 3
Po operacji postępowej itr1 znajduje się na: 3
Korzystając z powyższego programu, zademonstrowaliśmy użycie różnych operacji iteracyjnych.
Wniosek
W ten sposób doszliśmy do końca tego samouczka o iteratorach.
Jak dotąd omawialiśmy podstawy STL, od naszego następnego samouczka zaczniemy od kontenerów STL i ich programowania.
=> Sprawdź całą serię szkoleń DARMOWYCH w języku C ++ tutaj.
rekomendowane lektury
- Kolejka priorytetowa w STL
- Tablice w STL
- 70+ NAJLEPSZYCH samouczków C ++ do nauki programowania w C ++ ZA DARMO
- Ciągi, pary i krotki w STL
- ZESTAW W STL
- Algorytmy w STL
- Najlepsza DARMOWA seria samouczków języka C #: najlepszy przewodnik po języku C # dla początkujących
- Biblioteka standardowych szablonów (STL): krótkie wprowadzenie