Представление transform позволяет преобразовать данные из одного типа в другой. Для создания представления можно применять конструктор std::ranges::transform_view, который принимает контейнер, данные которого надо преобразовать, и функцию преобразования:
#include <iostream>
#include <string>
#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 <string>
#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);