Menu
Coddy logo textTech

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
}
challenge icon

Wyzwanie

Łatwy

Zbudujmy 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ą w std::vector<int>.

    Twoja klasa powinna udostępniać następujące metody:

    • addItem(int quantity): dodaje ilość przedmiotu do zapasów
    • printForward(): używa iteratorów begin() i end(), aby wypisać wszystkie ilości oddzielone spacjami, a następnie znak nowej linii
    • printReverse(): używa iteratorów odwrotnych rbegin() i rend(), aby wypisać wszystkie ilości w odwrotnej kolejności, oddzielone spacjami, a następnie znak nowej linii
    • doubleAll(): używa iteratorów do przejścia przez wektor i podwojenia każdej ilości w miejscu
    • getTotal(): używa iteratorów do obliczenia i zwrócenia sumy wszystkich ilości

    Użyj słowa kluczowego auto w 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 Inventory i dodaj wszystkie cztery ilości. Następnie zademonstruj użycie iteratorów, wykonując następujące czynności:

    1. Wypisz Forward:, a następnie wywołaj printForward()
    2. Wypisz Reverse:, a następnie wywołaj printReverse()
    3. Wypisz Total: <sum> za pomocą getTotal()
    4. Wywołaj doubleAll(), aby zmodyfikować ilości
    5. Wypisz After doubling:, a następnie wywołaj printForward()
    6. Wypisz New total: <sum> za pomocą getTotal()

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: 160

To 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;
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator C++ online