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