Tri par Lambda
Fait partie de la section Logique et Flux du Journey C++ de Coddy — leçon 47 sur 56.
La bibliothèque standard C++ fournit une fonction puissante appelée std::sort provenant de l'en-tête <algorithm> qui peut trier des conteneurs comme des vecteurs.
Par défaut, std::sort ordonne les éléments par ordre croissant (du plus petit au plus grand). Cependant, vous pouvez personnaliser ce comportement en fournissant une expression lambda qui définit comment les éléments doivent être comparés :
#include <vector>
#include <algorithm>
std::vector<int> numbers = {5, 2, 8, 1, 9};
// Trier par ordre décroissant en utilisant une lambda
std::sort(numbers.begin(), numbers.end(), [](int a, int b) {
return a > b; // Retourne vrai si a doit venir avant b
});La lambda prend deux paramètres représentant les éléments comparés et renvoie true si le premier élément doit se trouver avant le second dans le résultat trié. Pour un ordre décroissant, nous renvoyons true quand a > b, ce qui place les plus grands nombres en premier.
Cela démontre comment les lambdas facilitent la personnalisation des fonctions de la bibliothèque standard sans avoir à écrire des fonctions de comparaison distinctes, tout en gardant votre logique de tri exactement là où vous en avez besoin.
Défi
FacileCréez un programme qui démontre le tri personnalisé à l'aide d'expressions lambda avec std::sort. Ce défi testera votre compréhension de l'utilisation des fonctions lambda pour définir une logique de comparaison personnalisée pour le tri de conteneurs.
Les entrées suivantes seront fournies :
- Un entier
nreprésentant le nombre d'éléments dans le vecteur nentiers représentant les éléments à trier- Un caractère
orderreprésentant l'ordre de tri (Apour croissant,Dpour décroissant)
Votre programme doit :
- Créer un
std::vector<int>et le remplir avec les nombres saisis - Utiliser
std::sortde l'en-tête<algorithm>avec une expression lambda pour trier le vecteur - La lambda doit prendre deux paramètres entiers et retourner une valeur booléenne
- En fonction du caractère d'ordre, implémenter la logique de comparaison appropriée dans la lambda
- Afficher chaque élément du vecteur trié sur une ligne séparée
Le comportement de tri doit être le suivant :
- Si
orderestA: trier par ordre croissant (du plus petit au plus grand) - Si
orderestD: trier par ordre décroissant (du plus grand au plus petit)
Utilisez le format de sortie exact suivant :
[first_sorted_element]
[second_sorted_element]
...
[last_sorted_element]Rappelez-vous que std::sort prend trois paramètres : l'itérateur de début, l'itérateur de fin et une fonction de comparaison. Utilisez vector.begin() et vector.end() pour les itérateurs. La fonction de comparaison lambda doit retourner true si le premier paramètre doit se trouver avant le second paramètre dans le résultat trié. Pour l'ordre croissant, retournez a < b ; pour l'ordre décroissant, retournez a > b.
Aide-mémoire
La fonction std::sort de l'en-tête <algorithm> trie les conteneurs comme les vecteurs. Par défaut, elle trie par ordre croissant, mais vous pouvez personnaliser le comportement de tri en utilisant une expression lambda.
Syntaxe de base :
std::sort(container.begin(), container.end(), comparison_lambda);La lambda prend deux paramètres représentant les éléments comparés et renvoie true si le premier élément doit se trouver avant le second dans le résultat trié.
Exemple - ordre décroissant :
#include <algorithm>
#include <vector>
std::vector<int> numbers = {5, 2, 8, 1, 9};
std::sort(numbers.begin(), numbers.end(), [](int a, int b) {
return a > b; // Les nombres plus grands viennent en premier
});Exemple - ordre croissant :
std::sort(numbers.begin(), numbers.end(), [](int a, int b) {
return a < b; // Les nombres plus petits viennent en premier
});Essayez vous-même
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
// Lire l'entrée
int n;
cin >> n;
vector<int> numbers(n);
for (int i = 0; i < n; i++) {
cin >> numbers[i];
}
char order;
cin >> order;
// TODO: Écrivez votre code ci-dessous
// Utiliser std::sort avec une expression lambda pour trier le vecteur
// en fonction du caractère d'ordre (A pour croissant, D pour décroissant)
// Afficher les éléments triés
for (int num : numbers) {
cout << num << endl;
}
return 0;
}Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Logique et Flux
1Pointeurs et mémoire
Qu'est-ce qu'un pointeur ?Opérateur d'adresseOpérateur de déréférencementPointeurs nulsPointeurs et tableauxMémoire dynamique avec 'new'Libérer la mémoire avec 'delete'Récapitulatif - Pratique des pointeurs2Vecteurs (Tableaux dynamiques)
Introduction à std::vectorCréer un vecteurAjouter des élémentsAccéder aux élémentsTaille d'un vecteurItérer avec une boucle ForBoucle For basée sur l'intervalleSupprimer des élémentsRécapitulatif - Opérations sur les vecteurs3Projet : Outil de liste de tâches
Présentation du projetAjouter une tâche