Представление 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);