Algoritmi STL
Fa parte della sezione Programmazione orientata agli oggetti del percorso C++ di Coddy. Lezione 73 di 104.
Gli algoritmi STL sono funzioni template che operano su intervalli definiti da iteratori. Si trovano negli header <algorithm> e <numeric> e funzionano con qualsiasi contenitore che fornisca iteratori compatibili.
std::sort dispone gli elementi in ordine crescente per impostazione predefinita:
#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 cerca un valore e restituisce un iteratore alla prima corrispondenza, oppure end() se non viene trovato:
auto it = std::find(nums.begin(), nums.end(), 5);
if (it != nums.end()) {
std::cout << "Found at index: " << (it - nums.begin());
}std::transform applica un'operazione a ogni elemento e memorizza i risultati in un intervallo di destinazione:
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 di <numeric> combina tutti gli elementi in un unico valore:
#include <numeric>
int sum = std::accumulate(nums.begin(), nums.end(), 0);
// sum: 16 (1 + 2 + 5 + 8)Questi algoritmi accettano intervalli di iteratori anziché contenitori direttamente, il che li rende abbastanza flessibili da funzionare su intervalli parziali o su diversi tipi di contenitori con lo stesso codice.
Sfida
FacileCostruiamo un analizzatore di punteggi che elabora una raccolta di numeri usando gli algoritmi STL. Creerai funzioni di utilità che mostrano come sort, find, transform e accumulate collaborano per analizzare i dati.
Organizzerai il codice in due file:
ScoreAnalyzer.h: definisci funzioni di utilità che usano gli algoritmi STL per elaborare vettori di interi.Crea una funzione chiamata
sortScoresche accetta unstd::vector<int>&e lo ordina in ordine crescente usandostd::sort.Crea una funzione chiamata
findScoreche accetta unconst std::vector<int>&e un valore obiettivo di tipoint. Usastd::findper cercare il valore obiettivo. Se viene trovato, restituisci l'indice (la distanza da begin). Se non viene trovato, restituisci-1.Crea una funzione chiamata
applyBonusche accetta unconst std::vector<int>&e un bonus di tipoint. Usastd::transformper creare e restituire un nuovo vettore in cui a ogni punteggio viene aggiunto il bonus.Crea una funzione chiamata
calculateAverageche accetta unconst std::vector<int>&e restituisce la media comedouble. Usastd::accumulateper calcolare la somma, quindi dividila per la dimensione.Crea una funzione chiamata
printVectorche accetta unconst std::vector<int>&e stampa tutti gli elementi separati da spazi, seguiti da una nuova riga.main.cpp: leggi sei valori (ciascuno su una riga separata):- Primo punteggio (intero)
- Secondo punteggio (intero)
- Terzo punteggio (intero)
- Quarto punteggio (intero)
- Un punteggio da cercare (intero)
- Un bonus da applicare (intero)
Crea un vettore con i quattro punteggi e mostra gli algoritmi:
- Stampa
Original:seguito dagli elementi del vettore - Ordina i punteggi e stampa
Sorted:seguito dal vettore ordinato - Cerca il punteggio obiettivo nel vettore ordinato. Se viene trovato, stampa
Found <value> at index <index>. Se non viene trovato, stampa<value> not found - Applica il bonus ai punteggi ordinati e stampa
With bonus:seguito dal nuovo vettore - Calcola e stampa la media dei punteggi ordinati originali (prima del bonus) come
Average: <value>con una cifra decimale
Per esempio, con i valori 75, 90, 60, 85, 85 e 5:
Original: 75 90 60 85
Sorted: 60 75 85 90
Found 85 at index 2
With bonus: 65 80 90 95
Average: 77.5Con i valori 100, 80, 95, 70, 50 e 10:
Original: 100 80 95 70
Sorted: 70 80 95 100
50 not found
With bonus: 80 90 105 110
Average: 86.2Ricorda di includere <algorithm> per sort, find e transform, e <numeric> per accumulate. Usa std::fixed e std::setprecision(1) da <iomanip> per formattare la media.
Provalo tu
#include <iostream>
#include <vector>
#include <iomanip>
#include "ScoreAnalyzer.h"
using namespace std;
int main() {
// Leggi sei valori di input
int score1, score2, score3, score4;
int searchTarget, bonusAmount;
cin >> score1;
cin >> score2;
cin >> score3;
cin >> score4;
cin >> searchTarget;
cin >> bonusAmount;
// TODO: Crea un vector con i quattro punteggi
// TODO: Stampa "Original:" seguito dal contenuto del vector
// TODO: Ordina i punteggi e stampa "Sorted:" seguito dal vector ordinato
// TODO: Cerca il punteggio desiderato nel vector ordinato
// Se viene trovato, stampa "Found <value> at index <index>"
// Se non viene trovato, stampa "<value> not found"
// TODO: Applica il bonus ai punteggi ordinati e stampa "With bonus:" seguito dal nuovo vector
// TODO: Calcola e stampa la media dei punteggi ordinati (prima del bonus)
// Usa fixed e setprecision(1) per la formattazione
// Stampa nel formato "Average: <value>"
return 0;
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione orientata agli oggetti
File esterniBuild e compilazione in C++File header e file sorgenteNamespace e ambitoIntroduzione alla programmazione orientata agli oggetti in C++Classi e oggetti a confrontoIl puntatore 'this'Metodi (funzioni membro)Attributi (membri dati)Fondamenti di costruttori e distruttoriRiepilogo - Calcolatrice semplice4Proprietà delle classi
Membri di istanza e staticiGetter e setterFunzioni membro constParola chiave mutableMetodi e variabili staticiFunzioni e classi friendRiepilogo - Gestore di conti bancari7Ereditarietà
Ereditarietà di baseLivelli di accesso nell’ereditarietàOrdine di chiamata di costruttori e distruttoriRidefinizione dei metodiFunzioni virtuali e VTableEreditarietà multiplaEreditarietà virtualeRiepilogo - Gerarchia dei dipendenti10Panoramica della STL
Panoramica e filosofia della STLContenitori STLIteratoriAlgoritmi STLFuntori ed espressioni lambdaRiepilogo - Frequenza delle parole2Gestione della memoria
Memoria Stack vs HeapPuntatori e riferimentiMemoria dinamica (new/delete)Puntatori intelligenti in C++RAII in C++Riepilogo - Gestore di array dinamico5Incapsulamento
Specificatori di accesso in C++Specificatori di accesso in dettaglioOccultamento delle informazioniStruct vs classClassi annidate e interneRiepilogo - Sistema di registrazione degli studenti8Polimorfismo
Polimorfismo a compile time e a runtimeOverload delle funzioniFunzioni virtuali: ripassoFunzioni virtuali pureClassi astratteProgettazione delle interfacce in C++Dynamic casting e RTTIRipasso: calcolatrice di forme11Concetti avanzati di OOP
Composizione vs ereditarietàMixin tramite CRTPIdiom PimplType ErasureEnum class e tipizzazione forteGestione delle eccezioni in OOPGerarchie personalizzate di eccezioni14Pattern di progettazione - Parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern CompositeRAII come pattern3Costruttori e distruttori
Costruttore predefinitoCostruttore con parametriCostruttore di copiaCostruttore di spostamentoListe di inizializzazione dei costruttoriCostruttori delegantiApprofondimento sui distruttoriRegola del Tre / Cinque / ZeroRipasso - classe String6Sovraccarico degli operatori
Introduzione al sovraccarico degli operatoriSovraccarico degli operatori aritmeticiSovraccarico degli operatori di confrontoOperatori di flussoSovraccarico dell'operatore di assegnazioneSovraccarico degli operatori [] e ()Operatori di conversione di tipoRipasso - Classe Matrix9Template
Template di funzioneTemplate di classeSpecializzazione dei templateTemplate variadiciBasi di SFINAE e dei trait di tipoRiepilogo - Contenitore genericoEsercitati da solo: Compilatore C++ online