Ordenação com Lambda
Parte da seção Lógica & Fluxo do Journey de C++ da Coddy — lição 47 de 56.
A Biblioteca Padrão C++ fornece uma função poderosa chamada std::sort do cabeçalho <algorithm> que pode ordenar contêineres como vetores.
Por padrão, std::sort organiza os elementos em ordem crescente (do menor para o maior). No entanto, você pode personalizar esse comportamento fornecendo uma expressão lambda que define como os elementos devem ser comparados:
#include <vector>
#include <algorithm>
std::vector<int> numbers = {5, 2, 8, 1, 9};
// Ordenar em ordem decrescente usando uma lambda
std::sort(numbers.begin(), numbers.end(), [](int a, int b) {
return a > b; // Retorna true se a deve vir antes de b
});A lambda recebe dois parâmetros representando os elementos que estão sendo comparados e retorna true se o primeiro elemento deve vir antes do segundo no resultado ordenado. Para ordem decrescente, retornamos true quando a > b, o que coloca os números maiores primeiro.
Isso demonstra como as lambdas facilitam a personalização de funções da biblioteca padrão sem a necessidade de escrever funções de comparação separadas, mantendo sua lógica de ordenação exatamente onde você precisa.
Desafio
FácilCrie um programa que demonstre a ordenação personalizada usando expressões lambda com std::sort. Este desafio testará sua compreensão de como usar funções lambda para definir uma lógica de comparação personalizada para ordenar contêineres.
As seguintes entradas serão fornecidas:
- Um número inteiro
nrepresentando o número de elementos no vetor nnúmeros inteiros representando os elementos a serem ordenados- Um caractere
orderrepresentando a ordem de ordenação ('A'para ascendente,'D'para descendente)
Seu programa deve:
- Criar um
std::vector<int>e preenchê-lo com os números de entrada - Usar
std::sortdo cabeçalho<algorithm>com uma expressão lambda para ordenar o vetor - A lambda deve receber dois parâmetros inteiros e retornar um valor booleano
- Com base no caractere de ordem, implemente a lógica de comparação apropriada na lambda
- Imprimir cada elemento do vetor ordenado em uma linha separada
O comportamento de ordenação deve ser:
- Se
orderfor'A': ordenar em ordem crescente (do menor para o maior) - Se
orderfor'D': ordenar em ordem decrescente (do maior para o menor)
Use o seguinte formato de saída exato:
[first_sorted_element]
[second_sorted_element]
...
[last_sorted_element]Lembre-se de que std::sort recebe três parâmetros: o iterador de início, o iterador de fim e uma função de comparação. Use vector.begin() e vector.end() para os iteradores. A função de comparação lambda deve retornar true se o primeiro parâmetro deve vir antes do segundo parâmetro no resultado ordenado. Para ordem crescente, retorne a < b; para ordem decrescente, retorne a > b.
Folha de consulta
A função std::sort do cabeçalho <algorithm> ordena containers como vetores. Por padrão, ela ordena em ordem crescente, mas você pode personalizar o comportamento da ordenação usando uma expressão lambda.
Sintaxe básica:
std::sort(container.begin(), container.end(), comparison_lambda);A lambda recebe dois parâmetros representando os elementos que estão sendo comparados e retorna true se o primeiro elemento deve vir antes do segundo no resultado ordenado.
Exemplo - ordem decrescente:
#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; // Larger numbers come first
});Exemplo - ordem crescente:
std::sort(numbers.begin(), numbers.end(), [](int a, int b) {
return a < b; // Smaller numbers come first
});Experimente você mesmo
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
// Ler a entrada
int n;
cin >> n;
vector<int> numbers(n);
for (int i = 0; i < n; i++) {
cin >> numbers[i];
}
char order;
cin >> order;
// TODO: Escreva seu código abaixo
// Use std::sort com uma expressão lambda para ordenar o vetor
// com base no caractere de ordem (A para ascendente, D para descendente)
// Imprimir os elementos ordenados
for (int num : numbers) {
cout << num << endl;
}
return 0;
}Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Lógica & Fluxo
1Ponteiros e Memória
O que é um Ponteiro?Operador de EndereçoOperador de DesreferenciaçãoPonteiros NulosPonteiros e ArraysMemória Dinâmica com 'new'Liberando Memória com 'delete'Recapitulação - Prática com Ponteiros4Mapas (Pares Chave-Valor)
Introdução ao std::mapCriando um MapaAcessando e Modificando ValoresVerificando ChavesRemovendo ParesIterando sobre um MapaRecapitulação - Frequência de Palavras7Funções Avançadas
Passagem por ReferênciaIntrodução a Expressões LambdaLambdas com ParâmetrosLambdas com Valores de RetornoIntrodução à RecursãoFatorial RecursivoOrdenação com Lambda2Vetores (Arrays Dinâmicos)
Introdução ao std::vectorCriando um VetorAdicionando ElementosAcessando ElementosTamanho do VetorIterando com um Loop ForLoop For Baseado em IntervaloRemovendo ElementosRecapitulação - Operações com Vetores3Projeto: Ferramenta de Lista de Tarefas
Visão Geral do ProjetoAdicionando uma Tarefa