Iteratory
Część sekcji Programowanie obiektowe ścieżki C++ w Coddy. Lekcja 72 z 104.
Iteratory to obiekty, które pełnią funkcję pomostu między kontenerami a algorytmami. Zapewniają jednolity sposób dostępu do elementów w dowolnym kontenerze, niezależnie od tego, jak dany kontener przechowuje wewnętrznie swoje dane. Pomyśl o iteratorze jak o uogólnionym wskaźniku, który wie, jak poruszać się po kontenerze.
Każdy kontener STL udostępnia metody begin() i end(). Iterator begin() wskazuje pierwszy element, a end() wskazuje pozycję za ostatnim elementem — wartownika oznaczającego miejsce, w którym należy się zatrzymać:
#include <vector>
#include <iostream>
int main() {
std::vector<int> nums = {10, 20, 30};
for (std::vector<int>::iterator it = nums.begin(); it != nums.end(); ++it) {
std::cout << *it << " "; // Użyj dereferencji, aby uzyskać wartość
}
// Wynik: 10 20 30
}Słowo kluczowe auto znacznie upraszcza deklaracje iteratorów:
for (auto it = nums.begin(); it != nums.end(); ++it) {
*it *= 2; // Modyfikuj elementy za pomocą iteratora
}
// nums ma teraz wartość {20, 40, 60}Iteratory należą do różnych kategorii w zależności od swoich możliwości. Iteratory dostępu swobodnego (takie jak te z vector) obsługują operacje arytmetyczne, takie jak it + 3 lub it1 - it2.
Iteratory dwukierunkowe (z list, map) mogą poruszać się do przodu i do tyłu za pomocą ++ i --. Iteratory jednokierunkowe mogą poruszać się tylko w jednym kierunku.
Do przechodzenia w odwrotnym kierunku użyj rbegin() i rend():
for (auto rit = nums.rbegin(); rit != nums.rend(); ++rit) {
std::cout << *rit << " "; // Wypisuje w odwrotnej kolejności
}Wyzwanie
ŁatwyZbudujmy system śledzenia zapasów, który używa iteratorów do przechodzenia przez kolekcje przedmiotów i manipulowania nimi. Poćwiczysz używanie różnych typów iteratorów do poruszania się po danych na różne sposoby.
Rozmieścisz kod w dwóch plikach:
Inventory.h: Zdefiniuj klasęInventory, która zarządza kolekcją ilości przedmiotów przechowywaną wstd::vector<int>.Twoja klasa powinna udostępniać następujące metody:
addItem(int quantity): dodaje ilość przedmiotu do zapasówprintForward(): używa iteratorówbegin()iend(), aby wypisać wszystkie ilości oddzielone spacjami, a następnie znak nowej liniiprintReverse(): używa iteratorów odwrotnychrbegin()irend(), aby wypisać wszystkie ilości w odwrotnej kolejności, oddzielone spacjami, a następnie znak nowej liniidoubleAll(): używa iteratorów do przejścia przez wektor i podwojenia każdej ilości w miejscugetTotal(): używa iteratorów do obliczenia i zwrócenia sumy wszystkich ilości
Użyj słowa kluczowego
autow deklaracjach iteratorów, aby kod był przejrzysty.main.cpp: Wczytaj cztery liczby całkowite (każdą w osobnym wierszu) reprezentujące ilości przedmiotów.Utwórz obiekt
Inventoryi dodaj wszystkie cztery ilości. Następnie zademonstruj użycie iteratorów, wykonując następujące czynności:- Wypisz
Forward:, a następnie wywołajprintForward() - Wypisz
Reverse:, a następnie wywołajprintReverse() - Wypisz
Total: <sum>za pomocągetTotal() - Wywołaj
doubleAll(), aby zmodyfikować ilości - Wypisz
After doubling:, a następnie wywołajprintForward() - Wypisz
New total: <sum>za pomocągetTotal()
- Wypisz
Na przykład, dla danych wejściowych 10, 25, 15 i 30:
Forward: 10 25 15 30
Reverse: 30 15 25 10
Total: 80
After doubling: 20 50 30 60
New total: 160To wyzwanie pozwoli Ci poćwiczyć zarówno odczytywanie elementów za pomocą iteratorów (podczas wypisywania i sumowania), jak i modyfikowanie elementów za ich pomocą (podczas podwajania). Zobaczysz też, jak iteratory odwrotne ułatwiają przechodzenie wstecz bez manipulowania indeksami.
Spróbuj swoich sił
#include <iostream>
#include "Inventory.h"
using namespace std;
int main() {
// Wczytaj cztery liczby całkowite
int q1, q2, q3, q4;
cin >> q1;
cin >> q2;
cin >> q3;
cin >> q4;
// TODO: Utwórz obiekt Inventory
// TODO: Dodaj wszystkie cztery ilości do magazynu
// TODO: Wypisz "Forward: ", a następnie wywołaj printForward()
// TODO: Wypisz "Reverse: ", a następnie wywołaj printReverse()
// TODO: Wypisz "Total: ", a po nim wynik getTotal()
// TODO: Wywołaj doubleAll(), aby zmienić ilości
// TODO: Wypisz "After doubling: ", a następnie wywołaj printForward()
// TODO: Wypisz "New total: ", a po nim wynik getTotal()
return 0;
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneBudowanie i kompilacja C++Pliki nagłówkowe i pliki źródłowePrzestrzenie nazw i zakresWprowadzenie do programowania obiektowego w C++Klasy a obiektyWskaźnik „this”Metody (funkcje składowe)Atrybuty (składowe danych)Podstawy konstruktorów i destruktorówPowtórzenie – prosty kalkulator4Właściwości klas
Elementy instancji a elementy statyczneGettery i setteryStałe funkcje składoweSłowo kluczowe mutableMetody i zmienne statyczneFunkcje i klasy zaprzyjaźnionePodsumowanie – menedżer konta bankowego7Dziedziczenie
Podstawy dziedziczeniaPoziomy dostępu w dziedziczeniuKolejność wywołań konstruktora i destruktoraNadpisywanie metodFunkcje wirtualne i VTableWielokrotne dziedziczenieDziedziczenie wirtualnePowtórzenie — hierarchia pracowników2Zarządzanie pamięcią
Pamięć stosu a stertyWskaźniki i referencjePamięć dynamiczna (new/delete)Inteligentne wskaźniki w C++RAII w C++Podsumowanie — menedżer tablicy dynamicznej5Hermetyzacja
Specyfikatory dostępu w C++Specyfikatory dostępu — szczegółowoUkrywanie informacjiStruktura a klasaKlasy zagnieżdżone i wewnętrznePodsumowanie — system ewidencji studentów8Polimorfizm
Polimorfizm czasu kompilacji i wykonaniaPrzeciążanie funkcjiFunkcje wirtualne — powtórkaCzysto wirtualne funkcjeKlasy abstrakcyjneProjektowanie interfejsów w C++Rzutowanie dynamiczne i RTTIPodsumowanie — kalkulator kształtów3Konstruktory i destruktory
Konstruktor domyślnyKonstruktor z parametramiKonstruktor kopiującyKonstruktor przenoszącyListy inicjalizacyjne konstruktoraKonstruktory delegująceDestruktor — szczegółowe omówienieZasada trzech / pięciu / zeraPodsumowanie — klasa String6Przeciążanie operatorów
Wprowadzenie do przeciążania operatorówPrzeciążanie operatorów arytmetycznychPrzeciążanie operatorów porównaniaOperatory strumieniowePrzeciążanie operatora przypisaniaPrzeciążanie operatorów [] i ()Operatory konwersji typówPodsumowanie — klasa Matrix9Szablony
Szablony funkcjiSzablony klasSpecjalizacja szablonówSzablony wariadycznePodstawy SFINAE i cech typówPodsumowanie — kontener generycznyPoćwicz samodzielnie: Kompilator C++ online