Namespaces
Variants

std::experimental::ranges:: adjacent_find

From cppreference.net
template < ForwardIterator I, Sentinel < I > S, class Proj = ranges:: identity ,

IndirectRelation < projected < I, Proj >> Pred = ranges:: equal_to <> >

I adjacent_find ( I first, S last, Pred pred = Pred { } , Proj proj = Proj { } ) ;
(1) (ranges TS)
template < ForwardRange R, class Proj = ranges:: identity ,

IndirectRelation < projected < ranges:: iterator_t < R > , Proj >> Pred = ranges:: equal_to <> >

ranges:: safe_iterator_t < R > adjacent_find ( R && r, Pred pred = Pred { } , Proj proj = Proj { } ) ;
(2) (ranges TS)
1) 在范围 [ first , last ) 中搜索两个连续相同的元素。元素通过 proj 投影后,使用 pred 进行比较。
2) (1) 相同,但使用 r 作为源范围,如同使用 ranges:: begin ( r ) 作为 first ,以及 ranges:: end ( r ) 作为 last

尽管存在上述声明,算法声明的实际模板参数数量和顺序是未指定的。因此,若在调用算法时使用了显式模板参数,该程序很可能不具备可移植性。

目录

参数

first, last - 要检查的元素范围
r - 要检查的元素范围
pred - 用于比较投影元素的谓词
proj - 应用于元素的投影

返回值

指向第一对相同元素中首个元素的迭代器,即首个满足以下条件的迭代器 i i i + 1 均在范围 [ first , last ) 内,且 ranges:: invoke ( pred, ranges:: invoke ( proj, * i ) , ranges:: invoke ( proj, * ( i + 1 ) ) ) ! = false

如果未找到此类元素,则返回一个与 last 相等的迭代器。

复杂度

如果范围非空,则谓词的应用次数恰好为 min((result - first) + 1, (last - first) - 1) ,其中 result 是返回值,而投影的应用次数最多为谓词应用次数的两倍。

可能的实现

template<ForwardIterator I, Sentinel<I> S, class Proj = ranges::identity,
         IndirectRelation<projected<I, Proj>> Pred = ranges::equal_to<>>
I adjacent_find(I first, S last, Pred pred = Pred{}, Proj proj = Proj{})
{
    if (first == last)
        return first;
    I next = first;
    ++next;
    while (next != last)
    {
        if (ranges::invoke(pred, ranges::invoke(proj, *first),
                                 ranges::invoke(proj, *next)))
            return first;
        ++next;
        ++first;
    }
    return next;
}

示例

参见

查找首个相邻的相等元素(或满足给定谓词的元素)
(函数模板)
移除范围内的连续重复元素
(函数模板)