Menu
Coddy logo textTech

Ordenamiento con lambda

Parte de la sección Lógica y Flujo del Journey de C++ de Coddy — lección 47 de 56.

La Biblioteca Estándar de C++ proporciona una función potente llamada std::sort del encabezado <algorithm> que puede ordenar contenedores como vectores.

Por defecto, std::sort ordena los elementos en orden ascendente (de menor a mayor). Sin embargo, puedes personalizar este comportamiento proporcionando una expresión lambda que defina cómo se deben comparar los elementos:

#include <vector>
#include <algorithm>

std::vector<int> numbers = {5, 2, 8, 1, 9};

// Ordenar en orden descendente usando una lambda
std::sort(numbers.begin(), numbers.end(), [](int a, int b) {
    return a > b;  // Devolver true si a debe ir antes que b
});

La lambda toma dos parámetros que representan los elementos que se están comparando y devuelve true si el primer elemento debe ir antes que el segundo en el resultado ordenado. Para el orden descendente, devolvemos true cuando a > b, lo que coloca los números más grandes primero.

Esto demuestra cómo las lambdas facilitan la personalización de las funciones de la biblioteca estándar sin tener que escribir funciones de comparación independientes, manteniendo la lógica de ordenación justo donde la necesitas.

challenge icon

Desafío

Fácil

Crea un programa que demuestre el ordenamiento personalizado utilizando expresiones lambda con std::sort. Este desafío pondrá a prueba tu comprensión sobre cómo usar funciones lambda para definir una lógica de comparación personalizada para ordenar contenedores.

Se proporcionarán las siguientes entradas:

  • Un número entero n que representa la cantidad de elementos en el vector
  • n números enteros que representan los elementos a ordenar
  • Un carácter order que representa el orden de clasificación (A para ascendente, D para descendente)

Tu programa debe:

  1. Crear un std::vector<int> y poblarlo con los números de entrada
  2. Usar std::sort de la cabecera <algorithm> con una expresión lambda para ordenar el vector
  3. La lambda debe tomar dos parámetros enteros y devolver un valor booleano
  4. Basándote en el carácter de orden, implementa la lógica de comparación adecuada en la lambda
  5. Imprimir cada elemento del vector ordenado en una línea separada

El comportamiento de ordenamiento debe ser:

  • Si order es A: ordenar en orden ascendente (de menor a mayor)
  • Si order es D: ordenar en orden descendente (de mayor a menor)

Utiliza el siguiente formato de salida exacto:

[first_sorted_element]
[second_sorted_element]
...
[last_sorted_element]

Recuerda que std::sort toma tres parámetros: el iterador de inicio, el iterador de fin y una función de comparación. Usa vector.begin() y vector.end() para los iteradores. La función de comparación lambda debe devolver true si el primer parámetro debe ir antes que el segundo parámetro en el resultado ordenado. Para el orden ascendente, devuelve a < b; para el orden descendente, devuelve a > b.

Hoja de referencia

La función std::sort de la cabecera <algorithm> ordena contenedores como vectores. Por defecto, ordena en orden ascendente, pero puedes personalizar el comportamiento de ordenación utilizando una expresión lambda.

Sintaxis básica:

std::sort(container.begin(), container.end(), comparison_lambda);

La lambda toma dos parámetros que representan los elementos que se están comparando y devuelve true si el primer elemento debe ir antes que el segundo en el resultado ordenado.

Ejemplo - orden descendente:

#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;  // Los números mayores van primero
});

Ejemplo - orden ascendente:

std::sort(numbers.begin(), numbers.end(), [](int a, int b) {
    return a < b;  // Los números menores van primero
});

Pruébalo tú mismo

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    // Leer entrada
    int n;
    cin >> n;
    
    vector<int> numbers(n);
    for (int i = 0; i < n; i++) {
        cin >> numbers[i];
    }
    
    char order;
    cin >> order;
    
    // TODO: Escribe tu código a continuación
    // Usa std::sort con una expresión lambda para ordenar el vector
    // basado en el carácter de orden (A para ascendente, D para descendente)
    
    // Imprimir los elementos ordenados
    for (int num : numbers) {
        cout << num << endl;
    }
    
    return 0;
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Lógica y Flujo