Цепочки представлений

Последнее обновление: 31.03.2023

Обращение к элементам в представлении характеризуется отложенным выполнением. То есть фактически создание представление выполняется только тогда, когда происходит обращение к его элементам. Это позволяет комбинировать или составлять представления без потери производительности.

Например, нам надо взять 3 элемента, начиная с третьего элемента. Мы можем разбить задачу на два этапа:

  1. Пропустить 2 элемента:

    std::views::drop(2)
  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
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850