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.

De forma predeterminada, std::sort organiza los elementos en orden ascendente (de menor a mayor). Sin embargo, puedes personalizar este comportamiento proporcionando una expresión lambda que defina cómo deben compararse 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;  // Devuelve true si a debe ir antes que b
});

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

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 una ordenación personalizada mediante expresiones lambda con std::sort. Este desafío pondrá a prueba tu comprensión de cómo usar funciones lambda para definir una lógica de comparación personalizada para ordenar contenedores.

Se proporcionarán las siguientes entradas:

  • Un entero n que representa el número de elementos del vector
  • n enteros que representan los elementos que se ordenarán
  • 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 rellenarlo con los números de entrada
  2. Usar std::sort del encabezado <algorithm> con una expresión lambda para ordenar el vector
  3. La lambda debe recibir dos parámetros enteros y devolver un valor booleano
  4. Según el carácter de orden, implementar 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 ordenación 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)

Usa el siguiente formato de salida exacto:

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

Recuerda que std::sort recibe tres parámetros: el iterador inicial, el iterador final 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 aparecer antes que el segundo parámetro en el resultado ordenado. Para el orden ascendente, devuelve a < b; para el orden descendente, devuelve a > b.

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

Practica por tu cuenta: Compilador de C++ online