Обращение к элементам в представлении характеризуется отложенным выполнением. То есть фактически создание представление выполняется только тогда, когда происходит обращение к его элементам. Это позволяет комбинировать или составлять представления без потери производительности.
Например, нам надо взять 3 элемента, начиная с третьего элемента. Мы можем разбить задачу на два этапа:
Пропустить 2 элемента:
std::views::drop(2)
Взять 3 элемента:
std::views::drop(2)
Операция | повзволяет объединить все эти операции и создать единое представление:
#include <iostream>
#include <string>
#include <vector>
#include <ranges>
int main()
{
std::vector<std::string> people { "Tom", "Bob", "Alice", "Sam", "Kate", "Alex"};
// пропускаем 2 элемента и берем 3 элемента
auto view = people | std::views::drop(2) | std::views::take(3);
for(const auto& person: view)
{
std::cout << person << std::endl;
}
}
Консольный вывод программы:
Alice Sam Kate
Подобным образом можно наслаивать цепочку и из большего количества операций и использовать и другие типы представлений. Например, отфильтруем и преобразуем данные:
#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}
};
// фильтрация Person с age > 33
auto ageMoreThan33 = [](const Person& p){return p.getAge() > 33;};
// функция преобразования из Person в string
auto personToString = [](const Person& p){return p.getName();};
auto view = people |
std::views::filter(ageMoreThan33) |
std::views::transform(personToString);
for(const auto& person: view)
{
std::cout << person << std::endl;
}
}
В данном случае сначала отбираем все объекты Person, у которых поле age больше 33, и затем отобранные объекты преобразуются в строку - для каждого объекта Person возвращается значение поля name:
auto view = people |
std::views::filter(ageMoreThan33) |
std::views::transform(personToString);
Консольный вывод программы:
Tom Bob Alice