Menu
Coddy logo textTech

Pętla for oparta na zakresie

Część sekcji Logika i przepływ programu ścieżki C++ w Coddy. Lekcja 15 z 56.

Chociaż tradycyjne pętle for z indeksami dobrze sprawdzają się przy iterowaniu po wektorach, C++ oferuje bardziej eleganckie rozwiązanie: pętlę for opartą na zakresie. Ta nowoczesna składnia eliminuje konieczność ręcznego zarządzania indeksami i sprawia, że kod jest bardziej przejrzysty i łatwiejszy do odczytania.

Pętla for oparta na zakresie automatycznie obsługuje szczegóły iteracji. Zamiast zarządzać zmienną indeksu, po prostu określasz, co chcesz zrobić z każdym elementem:

std::vector<std::string> names = {"Alice", "Bob", "Charlie"};

for (const std::string& name : names) {
    std::cout << name << std::endl;
}

Ta pętla robi dokładnie to samo co tradycyjne podejście oparte na indeksach, ale ma znacznie prostszą składnię. Zmienna name automatycznie przyjmuje wartość każdego elementu wektora, po kolei.

Możesz zauważyć symbol & w deklaracji pętli: const std::string& name. W tym kontekście & nie oznacza „adresu”, jak mogłeś(-aś) widzieć wcześniej. Tutaj deklaruje on name jako referencję (alias) bezpośrednio do każdego elementu tablicy, zamiast tworzyć jego kopię. Pomyśl o tym jak o nadaniu nowej nazwy tym samym danym, podobnie jak przy użyciu wskaźnika do elementu, ale bez potrzeby jego dereferencji wewnątrz ciała pętli.

Słowo kluczowe const jest środkiem bezpieczeństwa: zapobiega przypadkowej modyfikacji elementu za pośrednictwem aliasu wewnątrz treści pętli. Sam alias nadal przechodzi do każdego kolejnego elementu w każdej iteracji. To zawartość, do której uzyskujesz dostęp za pośrednictwem aliasu, pozostaje niezmienna, a nie przebieg pętli.

Pętla for oparta na zakresie jest nie tylko bardziej czytelna, ale także bezpieczniejsza — nie ma ryzyka błędów indeksowania, ponieważ nie zarządzasz indeksami ręcznie. Działa z każdym kontenerem obsługującym iterację, dzięki czemu jest wszechstronnym narzędziem do przetwarzania zbiorów danych w C++.

challenge icon

Wyzwanie

Łatwy

Utwórz program demonstrujący pętlę for opartą na zakresie, który przetwarza kolekcję nazw miast i wyświetla je wraz z liczbą znaków.

Zostaną podane następujące dane wejściowe:

  • Liczba całkowita n reprezentująca liczbę miast
  • Następnie n ciągów znaków reprezentujących nazwy miast

Twój program powinien:

  1. Utworzyć std::vector<std::string> o nazwie cities
  2. Użyć push_back(), aby dodać do tablicy wektorowej każdą z n nazw miast
  3. Użyć pętli for opartej na zakresie, aby przejść przez tablicę wektorową
  4. Dla każdego miasta w pętli wyświetlić nazwę miasta, a następnie jej długość za pomocą metody .length()
  5. Po pętli wyświetlić łączną liczbę przetworzonych miast za pomocą metody wektora .size()

Użyj dokładnie następującego formatu wyjściowego:

City: [city name] (Length: [number of characters])\nCity: [city name] (Length: [number of characters])\n...\nTotal cities processed: [total count]

Pętla for oparta na zakresie powinna używać składni for (const std::string& city : cities), aby przejść przez każdy element tablicy wektorowej. Użyj city.length(), aby uzyskać liczbę znaków w każdej nazwie miasta.

Spróbuj swoich sił

#include <iostream>
#include <vector>
#include <string>
using namespace std;

int main() {
    // Wczytaj liczbę miast
    int n;
    cin >> n;
    
    // Utwórz wektor do przechowywania nazw miast
    vector<string> cities;
    
    // Wczytaj nazwy miast i dodaj je do wektora
    for (int i = 0; i < n; i++) {
        string city;
        cin >> city;
        cities.push_back(city);
    }
    
    // TODO: Napisz swój kod poniżej
    // Użyj pętli for opartej na zakresie, aby przejść przez wektor cities
    // Wypisz każde miasto wraz z długością jego nazwy w podanym formacie
    // Po zakończeniu pętli wypisz łączną liczbę przetworzonych miast
    
    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 Logika i przepływ programu

Poćwicz samodzielnie: Kompilator C++ online