Namespaces
Variants

std::experimental::ranges:: search_n

From cppreference.net
ヘッダーで定義 <experimental/ranges/algorithm>
template < ForwardIterator I, Sentinel < I > S, class T,

class Pred = ranges:: equal_to <> , class Proj = ranges:: identity >
requires IndirectlyComparable < I, const T * , Pred, Proj >
I search_n ( I first, S last, ranges :: difference_type_t < I > count,

const T & value, Pred pred = Pred { } , Proj proj = Proj { } ) ;
(1) (ranges TS)
template < ForwardRange R, class T, class Pred = ranges:: equal_to <> ,

class Proj = ranges:: identity >
requires IndirectlyComparable < ranges:: iterator_t < R > , const T * , Pred, Proj >
ranges:: safe_iterator_t < R > search_n ( R && r,
ranges :: difference_type_t < ranges:: iterator_t < R >> count,

const T & value, Pred pred = Pred { } , Proj proj = Proj { } ) ;
(2) (ranges TS)
1) 範囲 [ first , last ) 内で、述語 pred によって射影された値がそれぞれ指定された値 value に等しい、最初の count 個の要素からなる連続したシーケンスを検索します。
2) (1) と同じですが、 r をソース範囲として使用します。これは ranges:: begin ( r ) first として、 ranges:: end ( r ) last として使用する場合と同様です。

目次

パラメータ

first, last - 検査する要素の範囲
r - 検査する要素の範囲
count - 検索するシーケンスの長さ
value - 検索する値
pred - 射影された要素と value を比較する述語
proj - 要素に適用する射影

戻り値

範囲 [ first , last ) 内で見つかったシーケンスの先頭を指すイテレータ。 そのようなシーケンスが見つからない場合は、 last と等価なイテレータが返されます。

計算量

最大で last - first 回の述語と射影の適用。

実装例

template<ForwardIterator I, Sentinel<I> S, class T,
         class Pred = ranges::equal_to<>, class Proj = ranges::identity>
    requires IndirectlyComparable<I, const T*, Pred, Proj>
I search_n(I first, S last, ranges::difference_type_t<I> count,
           const T& value, Pred pred = Pred{}, Proj proj = Proj{})
{
    for (; first != last; ++first)
    {
        if (!ranges::invoke(pred, ranges::invoke(proj, *first), value))
            continue;
        I candidate = first;
        ranges::difference_type_t<I> cur_count = 0;
        while (true)
        {
            ++cur_count;
            if (cur_count == count)
                // 成功
                return candidate;
            ++first;
            if (first == last)
                // リストを走査し尽くした
                return first;
            if (!ranges::invoke(pred, ranges::invoke(proj, *first), value))
                // 連続する要素数が不足
                break;
        }
    {
    return first;
}

関連項目

範囲内で要素の連続する指定個数の最初の出現を検索する
(function template)
特定の範囲内で要素シーケンスの最後の出現を検索する
(function template)
特定の条件を満たす最初の要素を検索する
(function template)
要素の範囲を検索する
(function template)