Menu
Coddy logo textTech

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.

challenge icon

Desafio

Fácil

Crie 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 n representando o número de elementos no vetor
  • n números inteiros representando os elementos a serem ordenados
  • Um caractere order representando a ordem de ordenação ('A' para ascendente, 'D' para descendente)

Seu programa deve:

  1. Criar um std::vector<int> e preenchê-lo com os números de entrada
  2. Usar std::sort do cabeçalho <algorithm> com uma expressão lambda para ordenar o vetor
  3. A lambda deve receber dois parâmetros inteiros e retornar um valor booleano
  4. Com base no caractere de ordem, implemente a lógica de comparação apropriada na lambda
  5. Imprimir cada elemento do vetor ordenado em uma linha separada

O comportamento de ordenação deve ser:

  • Se order for 'A': ordenar em ordem crescente (do menor para o maior)
  • Se order for '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;
}
quiz iconTeste seus conhecimentos

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