Conteneurs et algorithmes de la STL en C++
Dans cette leçon, vous allez comparer les boucles écrites à la main pour traiter un tableau en C avec la combinaison d'algorithmes prêts à l'emploi de la bibliothèque standard du C++.
Introduction
La bibliothèque standard du C++ (STL) fournit des conteneurs comme vector et de très nombreux algorithmes prêts à l'emploi pour filtrer, additionner ou trier. Ces algorithmes travaillent sur un intervalle d'itérateurs, ce qui sépare le traitement de la façon dont les données sont stockées.
Points importants
- Comprenez comment on fait en C avant d'apprendre les abstractions du C++.
- Exprimez la possession des ressources avec RAII et la sémantique de valeur (value semantics).
- Préférez les outils sûrs du point de vue des types du C++ aux macros et aux conversions de type.
Exemples de code C et 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
Comparaison entre C et C++
La version C doit écrire toutes les boucles et gérer elle-même la taille du tableau even pour filtrer les nombres pairs puis les additionner. La version C++ combine std::copy_if pour filtrer et std::accumulate pour additionner sur un vector. Le code est plus court et plus réutilisable, et la complexité reste aussi claire qu'avec une boucle écrite à la main.
C utilise des conventions de nommage, des callbacks, des macros et des struct de contexte.
C++ offre des abstractions à la portée bien délimitée, sûres pour les types et généralement sans coût supplémentaire à l'exécution.
Exercices d'approfondissement
Exécutez les deux versions, puis modifiez le code pour observer la différence de sécurité qu'apporte chaque langage.
- Écrivez d'abord le mécanisme en C, puis utilisez la fonctionnalité équivalente du C++.
- Remplacez la libération manuelle des ressources par RAII.
- Vérifiez si la fonctionnalité provoque des allocations mémoire ou des appels de fonctions virtuelles.
S'entraîner avec un défi
Utilisez le contenu de cette leçon pour résoudre un vrai problème. Chaque défi s'exécute dans le navigateur, avec des tests instantanés et une revue par l'IA.
- Médiane d'une liste Trouvez la valeur centrale d'une liste après l'avoir triée. Facile
- Deuxième plus grande valeur Trouver la deuxième plus grande valeur distincte. Facile