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ą:
| Komponent | Cel | Przykłady |
|---|---|---|
| Kontenery | Przechowują kolekcje obiektów | vector, map, set |
| Iteratory | Zapewniają dostęp do elementów kontenera | Wejściowe, wyjściowe, swobodnego dostępu |
| Algorytmy | Wykonują operacje na danych | sort, 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.
Wyzwanie
ŁatwyZbudujmy 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 przyjmujestd::vector<int>&i wypisuje wszystkie elementy oddzielone spacjami, a następnie znak nowej linii. Użyj iteratorów (begin()iend()), aby przejść przez kontener.Utwórz funkcję o nazwie
sortAndPrint, która przyjmujestd::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 przyjmujestd::vector<int>&oraz wartość typuintdo wyszukania. Użyjstd::find, aby znaleźć element. Jeśli zostanie znaleziony, wypiszFound: <value>. Jeśli nie zostanie znaleziony, wypiszNot found: <value>.Utwórz funkcję o nazwie
getSum, która przyjmujestd::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):
- Pierwsza liczba całkowita
- Druga liczba całkowita
- Trzecia liczba całkowita
- Czwarta liczba całkowita
- 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:- Wypisz
Original:, a następnie wywołajprintVector - Wypisz
Sorted:, a następnie wywołajsortAndPrint - Wywołaj
findElementz szukaną wartością - Wypisz
Sum: <result>, używającgetSum
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: 16Dla danych wejściowych 10, 30, 20, 40 i 15:
Original: 10 30 20 40
Sorted: 10 20 30 40
Not found: 15
Sum: 100Zwróć 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;
}
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ów10Przegląd STL
Przegląd i filozofia STLKontenery STLIteratoryAlgorytmy STLFunktory i wyrażenia lambdaPowtórzenie – częstość występowania słó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