Menu
Coddy logo textTech

Ordinamento con lambda

Fa parte della sezione Logica e flusso del percorso C++ di Coddy. Lezione 47 di 56.

La libreria standard C++ fornisce una potente funzione chiamata std::sort dell'intestazione <algorithm> che può ordinare contenitori come i vettori.

Per impostazione predefinita, std::sort ordina gli elementi in ordine crescente (dal più piccolo al più grande). Tuttavia, puoi personalizzare questo comportamento fornendo un'espressione lambda che definisce come confrontare gli elementi:

#include <vector>
#include <algorithm>

std::vector<int> numbers = {5, 2, 8, 1, 9};

// Ordina in ordine decrescente usando una lambda
std::sort(numbers.begin(), numbers.end(), [](int a, int b) {
    return a > b;  // Restituisci true se a deve precedere b
});

La lambda accetta due parametri che rappresentano gli elementi confrontati e restituisce true se il primo elemento deve precedere il secondo nel risultato ordinato. Per l’ordine decrescente, restituiamo true quando a > b, il che colloca per primi i numeri più grandi.

Questo dimostra come le lambda rendano facile personalizzare le funzioni della libreria standard senza scrivere funzioni di confronto separate, mantenendo la logica di ordinamento proprio dove ti serve.

challenge icon

Sfida

Facile

Crea un programma che dimostri l'ordinamento personalizzato usando le espressioni lambda con std::sort. Questa sfida metterà alla prova la tua comprensione di come usare le funzioni lambda per definire una logica di confronto personalizzata per ordinare i contenitori.

Verranno forniti i seguenti input:

  • Un intero n che rappresenta il numero di elementi nel vettore
  • n interi che rappresentano gli elementi da ordinare
  • Un carattere order che rappresenta l'ordine di ordinamento (A per crescente, D per decrescente)

Il tuo programma dovrebbe:

  1. Creare un std::vector<int> e popolarlo con i numeri di input
  2. Usare std::sort dell'header <algorithm> con un'espressione lambda per ordinare il vettore
  3. La lambda dovrebbe accettare due parametri interi e restituire un valore booleano
  4. In base al carattere che indica l'ordine, implementare nella lambda la logica di confronto appropriata
  5. Stampare ogni elemento del vettore ordinato su una riga separata

Il comportamento dell'ordinamento dovrebbe essere il seguente:

  • Se order è A: ordinare in ordine crescente (dal più piccolo al più grande)
  • Se order è D: ordinare in ordine decrescente (dal più grande al più piccolo)

Usa il seguente formato di output esatto:

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

Ricorda che std::sort accetta tre parametri: l'iteratore iniziale, l'iteratore finale e una funzione di confronto. Usa vector.begin() e vector.end() per gli iteratori. La funzione lambda di confronto dovrebbe restituire true se il primo parametro deve precedere il secondo parametro nel risultato ordinato. Per l'ordine crescente, restituisci a < b; per l'ordine decrescente, restituisci a > b.

Provalo tu

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    // Leggi l'input
    int n;
    cin >> n;
    
    vector<int> numbers(n);
    for (int i = 0; i < n; i++) {
        cin >> numbers[i];
    }
    
    char order;
    cin >> order;
    
    // TODO: Scrivi il tuo codice qui sotto
    // Usa std::sort con un'espressione lambda per ordinare il vettore
    // in base al carattere order (A per ordine crescente, D per ordine decrescente)
    
    // Visualizza gli elementi ordinati
    for (int num : numbers) {
        cout << num << endl;
    }
    
    return 0;
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Logica e flusso

Esercitati da solo: Compilatore C++ online