Iterator jest opracowanym wskaźnikiem. Jak wskaźnik, wskazuje na obiekty tego samego typu w pamięci w różnych momentach. Wszystkie iteratory podlegają odniesieniu, z wyjątkiem iteratora wyjściowego, który można odnieść tylko dla zestawu typów. Wartość lub iterator można uzyskać wartość wskazaną przez wskaźnik lub iterator za pomocą operatora pośredniego, *. Liczbę całkowitą można dodać do niektórych iteratorów w ten sam sposób, a w tym samym celu liczba całkowita zostanie dodana do wskaźnika.
Pytania do tego artykułu to: Czym są te iteratory? Który z tych iteratorów jest używany z wektorem C ++? Jak te iteratory są używane z wektorem C ++? W tym artykule odpowiada na wszystkie te pytania w uproszczony sposób. Na końcu tego artykułu, kiedy odpowiedziałby na wszystkie te pytania, iteratory wektorowe C ++ będą intuicyjne i naturalne (dla czytelnika).
Treść artykułu
Podsumowanie iteratorów C ++
Iterator wejściowy
Idea iteratora wejściowego polega na otrzymaniu wartości wejściowej. W przeciwieństwie do iteratora wyjściowego, iterator wejściowy jest zawsze dostępny. W przypadku dwóch iteratorów wejściowych A i B, „A == B” nie oznacza „++ A == ++ B”.
Iterator wyjściowy
Idea iteratora wyjściowego polega na wydaniu wartości wyjściowej. W przeciwieństwie do iteratora wejściowego, iterator wyjściowy nie zawsze jest dostępny. Jest to możliwe do odniesienia tylko dla zestawu typów.
Iterator do przodu
Iterator do przodu może skanować wektor od początku do końca, jeden po drugim (przyrost). Ma wszystkie wymagania iteratora wejściowego oraz dodatkowe wymagania. Może zastąpić iterator wejściowy. Dla dwóch iteratorów do przodu, A i B, „A == B” implikuje „++ A == ++ B”.
Dwukierunkowy iterator
Iterator dwukierunkowy może skanować wektor od początku do końca, jeden po drugim. Od końca do początku, jeden po drugim (zmniejszenie). Ma wszystkie wymagania iteratora do przodu, a także dodatkowe wymagania. Może zastąpić iteratora do przodu. Dla dwóch dwukierunkowych iteratorów, A i B,
„A == B” implikuje „++ A == ++ B”
I
„-A == -b” implikuje „a == b”.
Iterator losowego dostępu
Iterator losowego dostępu ma wszystkie wymagania iteratora dwukierunkowego, a także dodatkowe wymagania. Może zastąpić dwukierunkową iterator. Iterator dostępu do losowego dostępu ma przewagę, że jeśli obecnie wskazuje na pierwszy element i wymagany jest czwarty element, pominąłby drugi i trzeci element i wskazałby czwarty element. Odwrotne pominięcie w dół jest prawdziwe.
Odwrotny iterator
Zauważ, że C ++ nie ma normalnego iteratora odwrotnego, ponieważ ma iterator do przodu. Istnieje więc adapter o nazwie odwrotny iterator. Jest więcej dobrych wiadomości: odwrotny iterator spełnia wszystkie wymagania dwukierunkowego iteratora.
Stały iterator
Jeśli mówi się, że iterator jest iteratorem const, element, którego wskazuje, nie można zmodyfikować.
Konstrukcja wektorowa i dostęp
Kontenery w C ++ to: klasa tablica, deque, napastnik_list, lista, wektor, mapa, set, nieoperared_map i nie uporządkowany. Wektor to pojemnik. Niektóre szablony funkcji w standardowej bibliotece C ++ działają z iteratorami bezpośrednio lub pośrednio. Pojemniki C ++, a także wektor, używają tych funkcji. Funkcje te można udostępnić programowi C ++ za pomocą dowolnej z następujących dyrektyw włączenia:
#włączać
Lub
#włączać
Włączenie któregokolwiek z pozostałych pojemników również udostępni te szablony funkcji. Szablon funkcji dotyczy funkcji, która może działać z różnymi typami danych. Wektor używa iteratorów poprzez te szablony funkcji. Niektóre szablony funkcji i ich związek z wektorem są następujące:
Budowa
Funkcja szablonu:
szablonConstexpr Auto Data (C&C) -> Deklaracja (C.dane());
Auto oznacza, że typ powrotu jest określany przy ocenie funkcji. C jest przedmiotem klasy C.
Przykładem obiektu wektorowego skonstruowanego za pomocą tego domyślnie jest:
wektorvtr;
Tutaj obiekt C jest pusty.
Funkcja szablonu:
szablonconstexpr const e* dane (inicitizer_list IL) no -ypcept;
Tutaj E* jest iteratorem, który wskazuje na pierwszy element listy lub kontenera. Jego stosowanie z wektorem byłoby z:
wektorvtr „a”, „b”, „c”, „d”, „e”;
wektor:: const_iterator it = vtr.zaczynać();
Funkcja szablonu ma bardziej zastosowanie do instrukcji początkowej () (druga instrukcja).
Dostęp
Funkcja szablonu:
szablonConstexpr Auto rozmiar (const c & c) -> deklaracja (c.rozmiar());
Zwraca to rozmiar kontenera. Przykład wektorowy:
wektorvtr „a”, „b”, „c”, „d”, „e”;
int n = vtr.rozmiar();
Cout << N << endl;
Wyjście to 5.
Funkcja szablonu:
szablon[[NINGISCARD]] constexpr bool pusta (inicitizer_list IL) no -ypcept;
Zwraca true, jeśli lista jest pusta lub fałszywa, w przeciwnym razie. Przykład wektorowy:
wektorvtr „a”, „b”, „c”, „d”, „e”;
Bool Bl = vtr.pusty();
Cout << bl << endl;
Dane wyjściowe to 0 dla fałszu.
Dostęp do zakresu
Istnieją inne funkcje szablonów, które wykorzystują iteratory, których wektor używa do problemów z zakresem zasięgu. Zakres to kolejny zestaw elementów kontenerowych.
Funkcja szablonu:
szablonconstexpr Auto Begin (C&C) -> Deklaracja (c.zaczynać());
To zwraca iterator wskazujący na pierwszy element na liście. Auto tutaj oznacza, że wartość zwrotna jest określana podczas oceny. Przykład dla wektora:
wektorvtr „a”, „b”, „c”, „d”, „e”;
wektor:: iterator it = vtr.zaczynać();
Cout << *it << '\n';
Wyjście to. Zwracany tutaj iterator to iterator dostępu do losowego. Stały iterator dostępu do losowego dostępu mógł zostać zwrócony - patrz później.
Szablon funkcji:
szablonconstexpr Auto End (const c & c) -> deklaracja (c.koniec());
Zwraca stały iterator wskazujący ostatni element listy. Kod wektorowy:
wektorvtr „a”, „b”, „c”, „d”, „e”;
wektor:: const_iterator it = vtr.koniec();
--To;
Cout << *it << ";
--To;
Cout << *it << endl;
Wyjście to „e d”. Stały iterator można zwiększyć lub zmniejszyć, ale wartość, której wskazuje, nie można zmienić. Normalny iterator dostępu do losowego dostępu mógł zostać zwrócony - patrz później.
Szablon funkcji:
szablonconstexpr reverse_iterator rbegin (inicitizer_list il);
Zwraca ostatnią wartość na liście. rbegin () wskazuje na ostatni element listy, a nie poza ostatnim elementem listy, jak end (). Przykład wektorowy:
wektorvtr „a”, „b”, „c”, „d”, „e”;
wektor:: reverse_iterator it = vtr.rbegin ();
Cout << *it << ";
++To;
Cout << *it << endl;
Wyjście to: e d. Z odwrotnym iteratorem ++ ma odwrotny efekt dla dwukierunkowego iteratora.
Szablon funkcji:
szablonconstexpr reverse_iterator Rend (inicitizer_list il);
Punkty tuż przed pierwszym elementem listy. Przykład wektorowy:
wektorvtr „a”, „b”, „c”, „d”, „e”;
wektor:: reverse_iterator it = vtr.rozdzierać();
--To;
Cout << *it << ";
--To;
Cout << *it << endl;
Wyjście to B. Z odwrotnym iteratorem - ma odwrotny efekt dla ++ iteratora dwukierunkowego.
Pod tym nagłówkiem istnieją inne funkcje szablonu - patrz później.
Włóż iteratory
reverse_iterator to adapter iterator, a nie iterator. Iterator Insert jest również adapterem iteratorem. Spełnia wszystkie wymagania iteratora wyjściowego oraz własne wymagania. Istnieje w trzech formach w C ++: The Back_inserter, Front_inserter i inserter. Każdy z nich ma swój własny konstruktor.
Back_inserter:
Wstawki z tyłu!
Ważne prototypy:
jawny back_insert_iterator (kontener i x);
back_insert_iterator & operator = (TypeName Container :: value_type && value);
Przykład wektorowy:
Wektor nie ma żadnej funkcji elementu wstawionego, która wkłada z tyłu. Jednak funkcja członka push_back (t) może być tak widoczna.
Front_inserter
Wkłada z przodu!
Ważne prototypy:
jawny front_insert_iterator (kontener i x);
front_insert_iterator & operator = (TypeName Container :: value_type && value);
Przykład wektorowy:
Wektor nie ma żadnej funkcji elementu wstawionego, która wkłada z przodu. Wektor nie ma również funkcji członka push_front (t).
Dobra wiadomość jest taka, że wektor ma funkcje członka, które mogą wstawić w dowolnym miejscu, na początku, wewnątrz lub na końcu wektora.
Inserter
Ten iterator na początku, wewnątrz lub na końcu wektora.
Ważne prototypy:
insert_iterator (Container & X, TypeName Container :: Iterator I);
insert_iterator & operator = (TypeName Container :: value_type && value);
Przykład wektorowy:
wektorvtr „a”, „b”, „c”, „d”, „e”;
wektor:: iterator it = vtr.zaczynać();
it = it + 2;
vtr.wstaw (it, „c”);
dla (int i = 0; iCout << vtr[i] << ", ";
Cout <Wyjście to:
A, B, C, C, D, E,Wyrażenie wektora wektora jest:
vtr.wstaw (it, „c”);Wkłada element tuż przed wskaźnikiem (it), na który wskazuje.
Przenieś iterator
Move_iterator jest również adapterem iteratorem. Poniższy program jest podobny do przykładu, który znajduje się w specyfikacji C ++:
#włączać
#włączać
#włączać
za pomocą przestrzeni nazw Std;
int main ()
listachs „a”, „b”, „c”, „d”, „e”;
wektorvtr (make_move_iterator (CHS.begin ()), make_move_iterator (CHS.koniec()));
Cout << "Original list Content:" << endl;
dla (auto it = chs.zaczynać(); To != CHS.koniec(); it ++)
Cout << *it << ", ";
Cout << endl << endl;
Cout << "Vector Content:" << endl;
dla (int i = 0; iCout << vtr[i] << ", ";
Cout << endl;
powrót 0;Wyjście to:
Oryginalna zawartość listy:
A, b, c, d, e,Treść wektorowa:
A, b, c, d, e,Ten iterator przekształca wartość źródłową na RValue przed umieszczeniem jej w miejscu docelowym.
Wniosek
Głównymi iteratorami w C ++ to iterator wejściowy, iterator wyjściowy, iterator do przodu, dwukierunkowy iterator i iterator losowego dostępu. Biblioteka standardowa C ++ ma niektóre szablony funkcji, które używają tych iteratorów. Wektor używa tych iteratorów poprzez szablony funkcji. Wektor ma różne nazwy niektórych z tych iteratorów. Istnieją również adaptery iterator, które to: reverse_iterator, adapter iterator i Move_iterator. Istnieją również niektóre warianty iteratorów. Wystarczy uwzględnić w programie, aby mieć wszystkie te funkcje. Po zrozumieniu roli tych iteratorów, adapterów i szablonów funkcji, które ich używają, użycie iteratorów z wektorami staje się intuicyjne.