Daily bit(e) C++. std::ranges::find_last, std::ranges::find_last_if, std::ranges::find_last_if_not
Добавлено 10 октября 2026 в 14:44
Daily bit(e) C++ 148, алгоритмы из C++23 для поиска последнего элемента – std::ranges::find_last, std::ranges::find_last_if и std::ranges::find_last_if_not.

Тройка алгоритмов из C++23 – std::ranges::find_last, std::ranges::find_last_if и std::ranges::find_last_if_not – предназначена для поиска последнего элемента, соответствующего заданному значению или предикату.
Хотя для двунаправленных диапазонов аналогичного результата можно добиться с помощью std::ranges::find, эти варианты способны работать и с однонаправленными диапазонами.
#include <forward_list>
#include <algorithm>
#include <ranges>
std::forward_list<int> data{1,2,3,4,5,6,7};
{
auto [it, end] = std::ranges::find_last(data, 5);
// *it == 5, end == data.end()
std::cout << "*it == " << *it << "\n";
}
auto is_even = [](int v) { return v % 2 == 0; };
{
auto [it, end] = std::ranges::find_last_if(data, is_even);
// *it == 6, end == data.end()
std::cout << "*it == " << *it << "\n";
}
// рассчитанный конец диапазона полезен при работе
// с ленивыми диапазонами
{
auto counted = std::views::counted(data.begin(), 5);
auto [it, end] = std::ranges::find_last_if(counted, is_even);
// *it == 4, *end == 6
std::cout << "*it == " << *it << "\n";
std::cout << "*end == " << *end << "\n";
}
