Обращение к элементам в представлении характеризуется отложенным выполнением. То есть фактически создание представление выполняется только тогда, когда происходит обращение к его элементам. Это позволяет комбинировать или составлять представления без потери производительности.
Например, нам надо взять 3 элемента, начиная с третьего элемента. Мы можем разбить задачу на два этапа:
Пропустить 2 элемента:
std::views::drop(2)
Взять 3 элемента:
std::views::drop(2)
Операция | повзволяет объединить все эти операции и создать единое представление:
#include <iostream> #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 <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