std::views::transform în C++

Creează o vedere în care fiecare element este rezultatul unei funcții aplicate elementului original.

Sintaxă
auto v = range | std::views::transform(functie);

Ce face std::views::transform

std::views::transform aplică funcția la fiecare element în momentul parcurgerii, fără să creeze un container nou. Containerul original rămâne neschimbat.

Este echivalentul leneș al lui std::transform. Se combină cu alte view-uri și, dacă ai nevoie de rezultat salvat, cu std::ranges::to.

Parametri

Parametru Descriere
range Sursa.
functie Funcția aplicată fiecărui element.

Ce returnează

Un view cu valorile transformate.

Exemple

Exemplul 1: Pătratele numerelor

#include <print>
#include <ranges>
#include <vector>

int main() {
    std::vector<int> v{1, 2, 3, 4, 5};
    auto patrate = v | std::views::transform([](int x) { return x * x; });

    std::println("{}", patrate);
    std::println("Originalul: {}", v);
}

Rezultat

[1, 4, 9, 16, 25]
Originalul: [1, 2, 3, 4, 5]

Exemplul 2: Doar numele dintr-o listă de structuri

#include <print>
#include <ranges>
#include <string>
#include <vector>

struct Angajat {
    std::string nume;
    int salariu;
};

int main() {
    std::vector<Angajat> echipa{{"Ana", 7500}, {"Bogdan", 6200}, {"Carmen", 8100}};

    for (const std::string& n : echipa | std::views::transform(&Angajat::nume)) {
        std::print("{} ", n);
    }
    std::println("");

    auto cu_bonus = echipa | std::views::transform([](const Angajat& a) { return a.salariu + 500; });
    std::println("{}", cu_bonus);
}

Rezultat

Ana Bogdan Carmen 
[8000, 6700, 8600]

Greșeli frecvente

  • Pui în funcție efecte secundare (afișări, contoare) și te miri că se execută de mai multe ori: funcția este apelată la fiecare acces, iar unele view-uri accesează un element de mai multe ori.

Comenzi înrudite

  • std::transform: Aplică o funcție fiecărui element și scrie rezultatele în alt interval (sau în același).
  • std::views::filter: Creează o vedere asupra unui container care conține doar elementele ce îndeplinesc o condiție, fără copiere.
  • std::ranges::to: Transformă un range sau un view (filtrat, transformat) într-un container nou: vector, set, string, map.