Menu
Coddy logo textTech

Przegląd i filozofia STL

Część sekcji Programowanie obiektowe ścieżki C++ w Coddy. Lekcja 70 z 104.

Standard Template Library (STL) to zbiór klas i funkcji opartych na szablonach, które udostępniają popularne struktury danych i algorytmy. Zbudowana w oparciu o poznane przez Ciebie koncepcje szablonów, biblioteka STL ucieleśnia potężną filozofię projektowania: oddzielanie przechowywania danych od ich przetwarzania.

STL jest zorganizowana wokół trzech podstawowych komponentów, które współpracują ze sobą:

KomponentCelPrzykłady
KonteneryPrzechowują kolekcje obiektówvector, map, set
IteratoryZapewniają dostęp do elementów konteneraWejściowe, wyjściowe, swobodnego dostępu
AlgorytmyWykonują operacje na danychsort, find, transform

Kluczowy wniosek jest taki, że algorytmy nie wiedzą bezpośrednio o kontenerach — działają za pośrednictwem iteratorów. Oznacza to, że jeden algorytm sort działa z wektorami, tablicami i dowolnym kontenerem udostępniającym odpowiedni typ iteratora:

#include <vector>
#include <algorithm>
#include <iostream>

int main() {
    std::vector<int> nums = {5, 2, 8, 1, 9};
    
    std::sort(nums.begin(), nums.end());
    
    for (int n : nums) {
        std::cout << n << " ";
    }
    // Wynik: 1 2 5 8 9
}

Ten podział oznacza, że możesz dowolnie łączyć różne elementy — używać dowolnego algorytmu z dowolnym zgodnym kontenerem bez pisania nowego kodu. STL udostępnia sprawdzone w praktyce, zoptymalizowane implementacje, dzięki czemu możesz skupić się na rozwiązywaniu problemów, zamiast ponownie tworzyć popularne struktury danych.

challenge icon

Wyzwanie

Łatwy

Zbudujmy prosty system przetwarzania danych, który pokazuje filozofię STL polegającą na oddzieleniu kontenerów, iteratorów i algorytmów. Utworzysz moduł narzędziowy korzystający z komponentów STL oraz program główny pokazujący, jak te elementy współpracują.

Utworzysz dwa pliki:

  • DataProcessor.h: Zdefiniuj funkcje narzędziowe, które działają z kontenerami STL za pośrednictwem iteratorów, pokazując filozofię projektową STL.

    Utwórz funkcję o nazwie printVector, która przyjmuje std::vector<int>& i wypisuje wszystkie elementy oddzielone spacjami, a następnie znak nowej linii. Użyj iteratorów (begin() i end()), aby przejść przez kontener.

    Utwórz funkcję o nazwie sortAndPrint, która przyjmuje std::vector<int>&, sortuje go za pomocą std::sort, a następnie wypisuje posortowane elementy oddzielone spacjami, po czym wypisuje znak nowej linii.

    Utwórz funkcję o nazwie findElement, która przyjmuje std::vector<int>& oraz wartość typu int do wyszukania. Użyj std::find, aby znaleźć element. Jeśli zostanie znaleziony, wypisz Found: <value>. Jeśli nie zostanie znaleziony, wypisz Not found: <value>.

    Utwórz funkcję o nazwie getSum, która przyjmuje std::vector<int>& i zwraca sumę wszystkich elementów. Możesz w tym celu użyć prostej pętli z iteratorami.

  • main.cpp: Wczytaj dane wejściowe i pokaż, jak współpracują komponenty STL.

    Wczytaj pięć wartości (każdą w osobnej linii):

    1. Pierwsza liczba całkowita
    2. Druga liczba całkowita
    3. Trzecia liczba całkowita
    4. Czwarta liczba całkowita
    5. Wartość do wyszukania

    Utwórz std::vector<int> i dodaj do niego pierwsze cztery liczby całkowite. Następnie pokaż filozofię STL, wykonując następujące czynności:

    1. Wypisz Original:, a następnie wywołaj printVector
    2. Wypisz Sorted:, a następnie wywołaj sortAndPrint
    3. Wywołaj findElement z szukaną wartością
    4. Wypisz Sum: <result>, używając getSum

Na przykład dla danych wejściowych 5, 2, 8, 1 i 8:

Original: 5 2 8 1 
Sorted: 1 2 5 8 
Found: 8
Sum: 16

Dla danych wejściowych 10, 30, 20, 40 i 15:

Original: 10 30 20 40 
Sorted: 10 20 30 40 
Not found: 15
Sum: 100

Zwróć uwagę, jak funkcje działają z wektorem za pośrednictwem iteratorów oraz jak std::sort i std::find działają na dowolnym kontenerze udostępniającym odpowiedni typ iteratora. Na tym polega siła projektu STL: algorytmy są niezależne od kontenerów i łączą się z nimi wyłącznie za pośrednictwem iteratorów.

Spróbuj swoich sił

#include <iostream>
#include <vector>
#include "DataProcessor.h"

using namespace std;

int main() {
    // Wczytaj pięć liczb całkowitych z wejścia
    int num1, num2, num3, num4, searchValue;
    cin >> num1;
    cin >> num2;
    cin >> num3;
    cin >> num4;
    cin >> searchValue;
    
    // TODO: Utwórz wektor i dodaj do niego pierwsze cztery liczby całkowite
    
    // TODO: Wypisz "Original: " i wywołaj printVector
    
    // TODO: Wypisz "Sorted: " i wywołaj sortAndPrint
    
    // TODO: Wywołaj findElement z szukaną wartością
    
    // TODO: Wypisz "Sum: ", a następnie wynik getSum
    
    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