Contenitori e algoritmi della STL in C++
In questa lezione confronterai i cicli scritti a mano per elaborare gli array in C con la combinazione di algoritmi pronti della libreria standard del C++.
Introduzione
La libreria standard del C++ (STL) offre contenitori come vector e moltissimi algoritmi pronti, come filtrare, sommare e ordinare. Questi algoritmi lavorano su un intervallo di iteratori, separando l'elaborazione dal modo in cui i dati sono memorizzati.
Punti importanti
- Capisci come si fa in C prima di imparare le astrazioni del C++.
- Usa RAII e la semantica di valore (value semantics) per esprimere il possesso delle risorse.
- Preferisci gli strumenti del C++ con sicurezza dei tipi a macro e conversioni di tipo.
Esempi di codice C e C++
#include <stdio.h>
int main(void) {
int values[] = {3, 8, 2, 7, 6};
int even[5];
int count = 0;
int sum = 0;
for (int index = 0; index < 5; ++index) {
if (values[index] % 2 == 0) {
even[count++] = values[index];
}
}
for (int index = 0; index < count; ++index) {
sum += even[index];
}
printf("count=%d sum=%d\n", count, sum);
}
count=3 sum=16
#include <algorithm>
#include <iostream>
#include <iterator>
#include <numeric>
#include <vector>
int main() {
std::vector values{3, 8, 2, 7, 6};
std::vector<int> even;
std::copy_if(values.begin(), values.end(),
std::back_inserter(even),
[](int value) { return value % 2 == 0; });
std::cout << "count=" << even.size()
<< " sum="
<< std::accumulate(even.begin(), even.end(), 0) << '\n';
}
count=3 sum=16
Confronto tra C e C++
La versione in C deve scrivere tutti i cicli e gestire a mano la dimensione dell'array even per filtrare i numeri pari e poi sommarli. La versione in C++ combina std::copy_if per filtrare e std::accumulate per sommare su un vector. Il codice è più breve e riutilizzabile, e la complessità resta chiara come nel ciclo scritto a mano.
C usa convenzioni sui nomi, callback, macro e struct con il contesto.
C++ offre astrazioni con un ambito chiaro, sicure rispetto ai tipi e che di solito non costano nulla in più in esecuzione.
Esercizi di approfondimento
Esegui entrambe le versioni e poi modifica il codice per osservare la differenza di sicurezza che offre ciascun linguaggio.
- Scrivi prima il meccanismo in C e solo dopo usa la funzionalità equivalente del C++.
- Sostituisci la liberazione manuale delle risorse con RAII.
- Controlla se la funzionalità causa allocazioni di memoria o chiamate a funzioni virtuali.
Esercitati con una sfida
Usa ciò che questa lezione spiega per risolvere un problema reale. Ogni sfida gira nel browser, con test immediati e una revisione dell'IA.
- Mediana di una Lista Trova il valore centrale di una lista dopo averla ordinata. Facile
- Secondo Valore Più Grande Trova il secondo valore distinto più grande. Facile