Menu
Coddy logo textTech

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.

challenge icon

Wyzwanie

Łatwy

Zbudujmy 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 przyjmuje std::vector<int>& i sortuje go rosnąco za pomocą std::sort.

    Utwórz funkcję o nazwie findScore, która przyjmuje const std::vector<int>& oraz docelową wartość typu int. Użyj std::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 przyjmuje const std::vector<int>& oraz wartość bonusu typu int. Użyj std::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 przyjmuje const std::vector<int>& i zwraca średnią jako double. Użyj std::accumulate, aby obliczyć sumę, a następnie podziel ją przez rozmiar wektora.

    Utwórz funkcję o nazwie printVector, która przyjmuje const 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):
    1. Pierwszy wynik (liczba całkowita)
    2. Drugi wynik (liczba całkowita)
    3. Trzeci wynik (liczba całkowita)
    4. Czwarty wynik (liczba całkowita)
    5. Wynik do wyszukania (liczba całkowita)
    6. Wartość bonusu do zastosowania (liczba całkowita)

    Utwórz wektor zawierający cztery wyniki i zademonstruj działanie algorytmów:

    1. Wypisz Original:, a następnie zawartość wektora
    2. Posortuj wyniki i wypisz Sorted:, a następnie posortowany wektor
    3. 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
    4. Dodaj bonus do posortowanych wyników i wypisz With bonus:, a następnie nowy wektor
    5. 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.5

Dla 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.2

Pamię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;
}
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