MySQL Java JavaScript PHP Python HTML-CSS C-sharp C++ Go

Proiecția datelor

Reprezentarea transform permite transformarea datelor dintr-un tip într-altul. Pentru a crea o reprezentare, se poate folosi constructorul std::ranges::transform_view, care primește un container ale cărui date trebuie transformate și o funcție de transformare:

#include <iostream>
#include <vector>
#include <ranges>

class Person
{
public:
    Person(std::string name, unsigned age): name{name}, age{age} {}
    std::string getName() const { return name; }
    unsigned getAge() const { return age; }
    void print() const
    {
        std::cout << name << "\t" << age << std::endl;
    }
private:
    std::string name;
    unsigned age;
}; 

int main()
{
    std::vector<Person> people 
    {
        Person{"Tom", 38}, Person{"Kate", 31}, Person{"Bob", 42}, 
        Person{"Alice", 34}, Person{"Sam", 25}
    };
    
    auto personToString = [](const Person& p) { return p.getName(); };
    auto view = std::ranges::transform_view{people, personToString};
 
    for (const auto& person : view)
    {
        std::cout << person << std::endl;
    }
}

În acest exemplu, în containerul people sunt stocate obiecte de tip Person. Funcția de transformare este definită ca un lambda, care transformă un obiect Person într-un șir de caractere (returnând numele utilizatorului):

auto personToString = [](const Person& p) { return p.getName(); };

În constructorul de reprezentare, transmitem containerul și funcția de transformare:

auto view = std::ranges::transform_view{people, personToString};

În final, obținem o reprezentare care conține doar șiruri de caractere - numele utilizatorilor. Ieșirea pe consolă va fi:

Tom
Kate
Bob
Alice
Sam

Ca alternativă, se poate utiliza funcția std::views::transform(), care primește o funcție de transformare:

#include <iostream>
#include <vector>
#include <ranges>

class Person
{
public:
    Person(std::string name, unsigned age): name{name}, age{age} {}
    std::string getName() const { return name; }
    unsigned getAge() const { return age; }
    void print() const
    {
        std::cout << name << "\t" << age << std::endl;
    }
private:
    std::string name;
    unsigned age;
}; 

int main()
{
    std::vector<Person> people 
    {
        Person{"Tom", 38}, Person{"Kate", 31}, Person{"Bob", 42}, 
        Person{"Alice", 34}, Person{"Sam", 25}
    };
    
    auto personToString = [](const Person& p) { return p.getName(); };
    auto view = people | std::views::transform(personToString);
 
    for (const auto& person : view)
    {
        std::cout << person << std::endl;
    }
}

Pentru a crea reprezentarea, folosim operatorul |, care se aplică asupra containerului și funcției std::views::transform:

auto view = people | std::views::transform(personToString);

Acesta va produce același rezultat ca și în cazul folosirii constructorului de reprezentare.