Panoramica e filosofia della STL
Fa parte della sezione Programmazione orientata agli oggetti del percorso C++ di Coddy. Lezione 70 di 104.
La Standard Template Library (STL) è una raccolta di classi e funzioni basate su template che forniscono strutture dati e algoritmi comuni. Basata sui concetti di template che hai imparato, la STL incarna una potente filosofia di progettazione: separare l'archiviazione dei dati dalla loro manipolazione.
La STL è organizzata attorno a tre componenti fondamentali che collaborano:
| Componente | Scopo | Esempi |
|---|---|---|
| Contenitori | Memorizzano raccolte di oggetti | vector, map, set |
| Iteratori | Forniscono accesso agli elementi dei contenitori | Input, output, accesso casuale |
| Algoritmi | Eseguono operazioni sui dati | sort, find, transform |
L'intuizione chiave è che gli algoritmi non conoscono direttamente i contenitori: lavorano tramite iteratori. Ciò significa che un singolo algoritmo sort funziona con vettori, array e qualsiasi contenitore che fornisca il tipo di iteratore corretto:
#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 << " ";
}
// Risultato: 1 2 5 8 9
}Questa separazione significa che puoi combinare liberamente: usa qualsiasi algoritmo con qualsiasi contenitore compatibile senza scrivere nuovo codice. La STL fornisce implementazioni collaudate e ottimizzate, così puoi concentrarti sulla risoluzione dei problemi invece di reinventare strutture dati comuni.
Sfida
FacileCostruiamo un semplice sistema di elaborazione dei dati che dimostri la filosofia della STL di separare contenitori, iteratori e algoritmi. Creerai un modulo di utilità che funziona con i componenti della STL e un programma principale che mostra come questi elementi interagiscono.
Creerai due file:
DataProcessor.h: definisci funzioni di utilità che operano sui contenitori STL tramite iteratori, dimostrando la filosofia di progettazione della STL.Crea una funzione chiamata
printVectorche accetta unstd::vector<int>&e stampa tutti gli elementi separati da spazi, seguiti da una nuova riga. Usa gli iteratori (begin()eend()) per attraversare il contenitore.Crea una funzione chiamata
sortAndPrintche accetta unstd::vector<int>&, lo ordina usandostd::sort, quindi stampa gli elementi ordinati separati da spazi, seguiti da una nuova riga.Crea una funzione chiamata
findElementche accetta unstd::vector<int>&e un valoreintda cercare. Usastd::findper individuare l'elemento. Se viene trovato, stampaFound: <value>. Se non viene trovato, stampaNot found: <value>.Crea una funzione chiamata
getSumche accetta unstd::vector<int>&e restituisce la somma di tutti gli elementi. Per farlo puoi usare un semplice ciclo con gli iteratori.main.cpp: leggi gli input e mostra come interagiscono i componenti della STL.Leggi cinque input (ciascuno su una riga separata):
- Primo intero
- Secondo intero
- Terzo intero
- Quarto intero
- Un valore da cercare
Crea un
std::vector<int>e aggiungi i primi quattro interi. Poi dimostra la filosofia della STL:- Stampa
Original:e poi chiamaprintVector - Stampa
Sorted:e poi chiamasortAndPrint - Chiama
findElementcon il valore da cercare - Stampa
Sum: <result>usandogetSum
Ad esempio, con gli input 5, 2, 8, 1 e 8:
Original: 5 2 8 1
Sorted: 1 2 5 8
Found: 8
Sum: 16Con gli input 10, 30, 20, 40 e 15:
Original: 10 30 20 40
Sorted: 10 20 30 40
Not found: 15
Sum: 100Nota come le tue funzioni operano sul vettore tramite iteratori e come std::sort e std::find funzionano con qualsiasi contenitore che fornisca il tipo di iteratore corretto. Questa è la potenza del design della STL: gli algoritmi sono disaccoppiati dai contenitori e collegati solo tramite iteratori.
Provalo tu
#include <iostream>
#include <vector>
#include "DataProcessor.h"
using namespace std;
int main() {
// Leggi cinque numeri interi dall'input
int num1, num2, num3, num4, searchValue;
cin >> num1;
cin >> num2;
cin >> num3;
cin >> num4;
cin >> searchValue;
// TODO: Crea un vector e aggiungici i primi quattro numeri interi
// TODO: Stampa "Original: " e chiama printVector
// TODO: Stampa "Sorted: " e chiama sortAndPrint
// TODO: Chiama findElement con il valore da cercare
// TODO: Stampa "Sum: " seguito dal risultato di getSum
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