Menu
Coddy logo textTech

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.

challenge icon

Défi

Facile

Cré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 n représentant le nombre d'éléments dans le vecteur
  • n entiers représentant les éléments à trier
  • Un caractère order représentant l'ordre de tri (A pour croissant, D pour décroissant)

Votre programme doit :

  1. Créer un std::vector<int> et le remplir avec les nombres saisis
  2. Utiliser std::sort de l'en-tête <algorithm> avec une expression lambda pour trier le vecteur
  3. La lambda doit prendre deux paramètres entiers et retourner une valeur booléenne
  4. En fonction du caractère d'ordre, implémenter la logique de comparaison appropriée dans la lambda
  5. Afficher chaque élément du vecteur trié sur une ligne séparée

Le comportement de tri doit être le suivant :

  • Si order est A : trier par ordre croissant (du plus petit au plus grand)
  • Si order est D : 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;
}
quiz iconTestez-vous

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