Namespaces
Variants

std::experimental::ranges:: search_n

From cppreference.net
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 ) 中搜索首个由 count 个元素组成的序列,这些元素的投影值根据谓词 pred 均等于给定值 value
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;
}

示例

参见

在范围中搜索首个连续出现指定次数的元素序列
(函数模板)
在特定范围中查找最后出现的元素序列
(函数模板)
查找首个满足特定条件的元素
(函数模板)
搜索元素范围
(函数模板)