@specsoftdev live:.cid.8e17e9b93cabb607 specsoftdev@gmail.com
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 do
C++20
Введён в стандарт.


See also

TODO

This page was last modified on 2025-06-02