Daily bit(e) C++. Проекции в алгоритмах для диапазонов в C++20
Добавлено 5 октября 2026 в 19:00
Daily bit(e) C++ 141, поддержка проекций в вариантах алгоритмов для диапазонов в C++20.

Поддержка проекций – одно из улучшений, представленных в версиях стандартных алгоритмов для диапазонов в 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)
