std::ranges::search_n
                Актуально для C++26.
                #include <algorithm>
                Актуально на 2025-06-02.
                Define overload #1
template<forward_iterator I, sentinel_for<I> S,
         class T,
         class Pred = ranges::equal_to,
         class Proj = identity>
requires indirectly_comparable<I, const T*, Pred, Proj>
constexpr subrange<I>
    search_n(I first, S last, iter_difference_t<I> count,
             const T& value, Pred pred = {}, Proj proj = {});
Ищет в диапазоне [first1, last1] значение "value" повторяющееся "count" раз.
Example, possible implementation
Define overload #2
template<forward_range R,
         class T,
         class Pred = ranges::equal_to,
         class Proj = identity>
requires indirectly_comparable<iterator_t<R>, const T*, Pred, Proj>
constexpr borrowed_subrange_t<R>
    search_n(R&& r, range_difference_t<R> count,
             const T& value, Pred pred = {}, Proj proj = {});
Ищет в диапазоне "r" значение "value" повторяющееся "count" раз.
Example, possible implementation
Возвращаемое значение
Вернёт ranges::subrange содержащий пару iterator-sentinel определяющих начало и конец найденного диапазона.
Если искомое значение отсутствует, вернёт {last1, last1}.
Notes
- Функция завершит работу как только встретится первое нужное значение.
 - Во избежание возврата из функции итератора ссылающегося на временный объект, будет возвращен объект std::ranges::dangling, если тип "r" не удовлетворяет требования концента ranges::borrowed_range.
 
Examples
Example 1:
#include <iostream>
#include <algorithm>
#include <string>
namespace ranges = std::ranges;
using namespace std::string_literals;
using namespace std::string_view_literals;
template<class T, class Tp>
constexpr std::string_view
fn(T&& haystack, ranges::range_difference_t<T> count, Tp needle)
{
    if constexpr(ranges::borrowed_range<T>)
    {
        auto result = ranges::search_n(std::forward<T>(haystack), count, needle);
        return result.empty() ?
                "No matches." :
                std::string_view{result.cbegin(), result.cend()};
    }
    else
        return "haystack is an borrowed_range?";
}
int main()
{
    std::string str = "aabcdaef";
    for (auto c : fn(str, 2, 'a'))
        std::cout << c;
    std::cout << std::endl;
    for (auto c : fn(std::string_view(str), 2, 'a'))
        std::cout << c;
    std::cout << std::endl;
    for (auto c : fn(std::move(str), 2, 'a'))
        std::cout << c;
    std::cout << std::endl;
}
aa aa haystack is an borrowed_range?
Changelog
C++26
to doC++20
Введён в стандарт.See also
TODO
 This page was last modified on 2025-06-02