Ежедневный бит (е) 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"}};

// Sort users by id (any invocable will work)
std::ranges::sort(users, {}, &User::id);
// {} instantiates the default comparator: std::ranges::less
// std::ranges::sort(users, std::ranges::less{}, &User::id);

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

// Find by name
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; }, // transformation
    [](int left) { return left + 10; },   // projection, first range
    [](int right) { return right / 2; }); // projection, second range
// out == 0 (11*0), 12 (12*1), 13 (13*1), 28 (14*2), 30 (15*2)

Откройте пример в Compiler Explorer.