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};

// Ordena 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 que representam os elementos que estão sendo comparados e retorna true se o primeiro elemento deve vir antes do segundo no resultado ordenado. Para uma 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 uma 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 inteiro n representando o número de elementos no vetor
  • n inteiros representando os elementos a serem ordenados
  • Um caractere order representando a ordem de classificação (A para crescente, D para decrescente)

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, implementar a lógica de comparação apropriada na lambda
  5. Imprimir cada elemento do vetor ordenado em uma linha separada

O comportamento da 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 exato de saída:

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

Lembre-se de que std::sort recebe três parâmetros: o iterador inicial, o iterador final 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.

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

Pratique por conta própria: Compilador de C++ online