Daily bit(e) C++. Проекции в алгоритмах для диапазонов в C++20

Добавлено 5 октября 2026 в 19:00

Daily bit(e) C++ 141, поддержка проекций в вариантах алгоритмов для диапазонов в C++20.

Daily bit(e) C++

Поддержка проекций – одно из улучшений, представленных в версиях стандартных алгоритмов для диапазонов в C++20.

Проекции применяются до того, как элементы передаются соответствующему вызываемому объекту.

Алгоритмы, работающие с несколькими исходными диапазонами, предоставляют отдельную проекцию для каждого диапазона.

Обратите внимание, что получение адресов стандартных функций (включая члены) является неопределенным поведением.

#include <ranges>
#include <algorithm>
#include <vector>

struct User 
{
    int64_t id;
    std::string name;
};

using namespace std::literals;

std::vector<User> users{{37,"Eliana Green"}, {23, "Logan Sterling"},
                        {1, "Isla Bennett"}, {7, "Marcel Jones"}};

// Сортировка пользователей по id
// (подойдет любой вызываемый объект)
std::ranges::sort(users, {}, &User::id);
// {} инстанцирует дефолтный компаратор: std::ranges::less
// std::ranges::sort(users, std::ranges::less{}, &User::id);

// users == {{1,"Isla..."}, {7,"Marcel..."},
//           {23,"Logan..."}, {37,"Eliana..."}}

// Поиск по имени
auto it = std::ranges::find(users, "Eliana Green"s, &User::name);
// it->id == 37, it->name == "Eliana Green"

std::vector<int> first{1,2,3,4,5};
std::vector<int> second{1,2,3,4,5};
std::vector<int> out;

std::ranges::transform(first, second, std::back_inserter(out), 
    [](int left, int right) { return left * right; }, // преобразование
    [](int left) { return left + 10; },   // проекция, первый диапазон
    [](int right) { return right / 2; }); // проекция, второй диапазон
// out == 0 (11*0), 12 (12*1), 13 (13*1), 28 (14*2), 30 (15*2)

Пример на Compiler Explorer

Теги

C++ / CppDaily bit(e) C++Программирование