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.
Desafío
FácilCrea 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
nque representa la cantidad de elementos en el vector nnúmeros enteros que representan los elementos a ordenar- Un carácter
orderque representa el orden de clasificación (Apara ascendente,Dpara descendente)
Tu programa debe:
- Crear un
std::vector<int>y poblarlo con los números de entrada - Usar
std::sortde la cabecera<algorithm>con una expresión lambda para ordenar el vector - La lambda debe tomar dos parámetros enteros y devolver un valor booleano
- Basándote en el carácter de orden, implementa la lógica de comparación adecuada en la lambda
- Imprimir cada elemento del vector ordenado en una línea separada
El comportamiento de ordenamiento debe ser:
- Si
orderesA: ordenar en orden ascendente (de menor a mayor) - Si
orderesD: 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;
}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
1Punteros y memoria
¿Qué es un puntero?Operador de direcciónOperador de desreferenciaPunteros nulosPunteros y arraysMemoria dinámica con 'new'Liberar memoria con 'delete'Resumen: Práctica de punteros4Mapas (Pares Clave-Valor)
Introducción a std::mapCrear un MapaAcceder y Modificar ValoresComprobar ClavesEliminar ParesIterar sobre un MapaResumen - Frecuencia de Palabras7Funciones avanzadas
Paso por referenciaIntroducción a expresiones lambdaLambdas con parámetrosLambdas con valores de retornoIntroducción a la recursividadFactorial recursivoOrdenamiento con lambda2Vectores (Arrays dinámicos)
Introducción a std::vectorCreación de un VectorAgregar elementosAcceder a los elementosTamaño del VectorIterar con un bucle ForBucle For basado en rangosEliminar elementosResumen - Operaciones con Vectores5Proyecto: Herramienta de inventario
Configuración del proyectoAgregar y actualizar artículos3Proyecto: Herramienta de lista de tareas
Descripción general del proyectoAñadir una tarea