Algorytmy STL
Część sekcji Programowanie obiektowe ścieżki C++ w Coddy. Lekcja 73 z 104.
Algorytmy STL to funkcje szablonowe działające na zakresach zdefiniowanych przez iteratory. Znajdziesz je w nagłówkach <algorithm> i <numeric>; działają z każdym kontenerem udostępniającym zgodne iteratory.
std::sort domyślnie układa elementy w kolejności rosnącej:
#include <algorithm>
#include <vector>
std::vector<int> nums = {5, 2, 8, 1};
std::sort(nums.begin(), nums.end());
// nums: {1, 2, 5, 8}std::find wyszukuje wartość i zwraca iterator do pierwszego dopasowania albo end(), jeśli jej nie znaleziono:
auto it = std::find(nums.begin(), nums.end(), 5);
if (it != nums.end()) {
std::cout << "Found at index: " << (it - nums.begin());
}std::transform stosuje operację do każdego elementu i zapisuje wyniki w zakresie docelowym:
std::vector<int> doubled(nums.size());
std::transform(nums.begin(), nums.end(), doubled.begin(),
[](int x) { return x * 2; });
// doubled: {2, 4, 10, 16}std::accumulate z <numeric> łączy wszystkie elementy w jedną wartość:
#include <numeric>
int sum = std::accumulate(nums.begin(), nums.end(), 0);
// sum: 16 (1 + 2 + 5 + 8)Te algorytmy przyjmują zakresy iteratorów zamiast bezpośrednio kontenerów, dzięki czemu są na tyle elastyczne, by działać na częściowych zakresach lub różnych typach kontenerów przy użyciu tego samego kodu.
Wyzwanie
ŁatwyZbudujmy analizator wyników, który przetwarza zbiór liczb za pomocą algorytmów STL. Utworzysz funkcje pomocnicze pokazujące, jak sort, find, transform i accumulate współpracują ze sobą przy analizowaniu danych.
Rozmieścisz swój kod w dwóch plikach:
ScoreAnalyzer.h: Zdefiniuj funkcje pomocnicze, które używają algorytmów STL do przetwarzania wektorów liczb całkowitych.Utwórz funkcję o nazwie
sortScores, która przyjmujestd::vector<int>&i sortuje go rosnąco za pomocąstd::sort.Utwórz funkcję o nazwie
findScore, która przyjmujeconst std::vector<int>&oraz docelową wartość typuint. Użyjstd::find, aby wyszukać tę wartość. Jeśli zostanie znaleziona, zwróć indeks (odległość od begin). Jeśli nie zostanie znaleziona, zwróć-1.Utwórz funkcję o nazwie
applyBonus, która przyjmujeconst std::vector<int>&oraz wartość bonusu typuint. Użyjstd::transform, aby utworzyć i zwrócić nowy wektor, w którym do każdego wyniku dodano bonus.Utwórz funkcję o nazwie
calculateAverage, która przyjmujeconst std::vector<int>&i zwraca średnią jakodouble. Użyjstd::accumulate, aby obliczyć sumę, a następnie podziel ją przez rozmiar wektora.Utwórz funkcję o nazwie
printVector, która przyjmujeconst std::vector<int>&i wypisuje wszystkie elementy oddzielone spacjami, a na końcu znak nowej linii.main.cpp: Wczytaj sześć wartości (każdą w osobnym wierszu):- Pierwszy wynik (liczba całkowita)
- Drugi wynik (liczba całkowita)
- Trzeci wynik (liczba całkowita)
- Czwarty wynik (liczba całkowita)
- Wynik do wyszukania (liczba całkowita)
- Wartość bonusu do zastosowania (liczba całkowita)
Utwórz wektor zawierający cztery wyniki i zademonstruj działanie algorytmów:
- Wypisz
Original:, a następnie zawartość wektora - Posortuj wyniki i wypisz
Sorted:, a następnie posortowany wektor - Wyszukaj docelowy wynik w posortowanym wektorze. Jeśli zostanie znaleziony, wypisz
Found <value> at index <index>. Jeśli nie zostanie znaleziony, wypisz<value> not found - Dodaj bonus do posortowanych wyników i wypisz
With bonus:, a następnie nowy wektor - Oblicz i wypisz średnią oryginalnych posortowanych wyników (przed dodaniem bonusu) jako
Average: <value>, z jednym miejscem po przecinku
Na przykład, dla danych wejściowych 75, 90, 60, 85, 85 i 5:
Original: 75 90 60 85
Sorted: 60 75 85 90
Found 85 at index 2
With bonus: 65 80 90 95
Average: 77.5Dla danych wejściowych 100, 80, 95, 70, 50 i 10:
Original: 100 80 95 70
Sorted: 70 80 95 100
50 not found
With bonus: 80 90 105 110
Average: 86.2Pamiętaj, aby dołączyć <algorithm> dla sort, find i transform, a także <numeric> dla accumulate. Użyj std::fixed i std::setprecision(1) z <iomanip>, aby sformatować średnią.
Spróbuj swoich sił
#include <iostream>
#include <vector>
#include <iomanip>
#include "ScoreAnalyzer.h"
using namespace std;
int main() {
// Wczytaj sześć wartości wejściowych
int score1, score2, score3, score4;
int searchTarget, bonusAmount;
cin >> score1;
cin >> score2;
cin >> score3;
cin >> score4;
cin >> searchTarget;
cin >> bonusAmount;
// TODO: Utwórz wektor z czterema wynikami
// TODO: Wypisz "Original:", a następnie zawartość wektora
// TODO: Posortuj wyniki i wypisz "Sorted:", a następnie posortowany wektor
// TODO: Wyszukaj docelowy wynik w posortowanym wektorze
// Jeśli zostanie znaleziony, wypisz "Found <value> at index <index>"
// Jeśli nie zostanie znaleziony, wypisz "<value> not found"
// TODO: Dodaj bonus do posortowanych wyników i wypisz "With bonus:", a następnie nowy wektor
// TODO: Oblicz i wypisz średnią posortowanych wyników (przed dodaniem bonusu)
// Użyj fixed i setprecision(1) do formatowania
// Wypisz w formacie "Average: <value>"
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