MySQL Java JavaScript PHP Python HTML-CSS C-sharp C++ Go

Lanturi de reprezentări

Accesul la elementele dintr-o reprezentare este caracterizat prin execuție amânată. Asta înseamnă că, de fapt, crearea unei reprezentări are loc doar atunci când are loc accesul la elementele sale. Acest lucru permite combinarea sau concatenarea reprezentărilor fără pierderi de performanță.

De exemplu, să presupunem că trebuie să luăm 3 elemente, începând de la al treilea element. Putem împărți sarcina în două etape:

  • Să sărim primele 2 elemente:
std::views::drop(2)
  • Să luăm 3 elemente:
std::views::take(3)

Operația | ne permite să combinăm toate aceste operații și să creăm o singură reprezentare:

#include <iostream>
#include <vector>
#include <ranges>

int main()
{
    std::vector<std::string> people { "Tom", "Bob", "Alice", "Sam", "Kate", "Alex"};

    // sărim 2 elemente și luăm 3 elemente
    auto view = people | std::views::drop(2) | std::views::take(3);

    for (const auto& person : view)
    {
        std::cout << person << std::endl;
    }
}

Ieșirea în consolă va fi:

Alice
Sam
Kate

În mod similar, putem combina mai multe operații și folosi și alte tipuri de reprezentări. De exemplu, să filtrăm și să transformăm datele:

#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}
    };
    // filtrarea obiectelor Person cu age > 33
    auto ageMoreThan33 = [](const Person& p) { return p.getAge() > 33; };
    // funcția de transformare din Person în 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;
    }
}

În acest caz, mai întâi selectăm toate obiectele Person al căror câmp age este mai mare de 33, iar apoi obiectele selectate sunt transformate în șiruri de caractere — pentru fiecare obiect Person returnând valoarea câmpului name:

auto view = people | 
        std::views::filter(ageMoreThan33) |
        std::views::transform(personToString);

Ieșirea în consolă va fi:

Tom
Bob
Alice