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.