Проекция данных

Последнее обновление: 31.03.2023

Представление transform позволяет преобразовать данные из одного типа в другой. Для создания представления можно применять конструктор std::ranges::transform_view, который принимает контейнер, данные которого надо преобразовать, и функцию преобразования:

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

В функцию преобразовани передается объекта типа, элементы которого хранятся в конейнере (в нашем случае объекты Person). В данном случае функция преобразования определена как лямбда-выражение, которое преобразует объект Person в строку - просто возвращаем имя пользователя:

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

В конструктор представления передаем контейнер и функцию преобразования:

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

В итоге мы получим представление, которое будет содержать только строки - имя пользователей. Консольный вывод:

Tom
Kate
Bob
Alice
Sam

В качестве альтернативы можно использовать функцию std::views::transform(), которая принимает функцию преобразования:

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

Для создания представления используем операцию |, которая применяется к контейнеру и функции std::views::transform

auto view = people | std::views::transform(personToString);
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850