Namespaces
Variants

std::experimental::ranges:: search

From cppreference.net
template < ForwardIterator I1, Sentinel < I1 > S1,

ForwardIterator I2, Sentinel < I2 > S2, class Pred = ranges:: equal_to <> ,
class Proj1 = ranges:: identity , class Proj2 = ranges:: identity >
requires IndirectlyComparable < I1, I2, Pred, Proj1, Proj2 >
I1 search ( I1 first1, S1 last1, I2 first2, S2 last2,

Pred pred = Pred { } , Proj1 proj1 = Proj1 { } , Proj2 proj2 = Proj2 { } ) ;
(1) (ranges TS)
template < ForwardRange R1, ForwardRange R2, class Pred = ranges:: equal_to <> ,

class Proj1 = ranges:: identity , class Proj2 = ranges:: identity >
requires IndirectlyComparable < ranges:: iterator_t < R1 > , ranges:: iterator_t < R2 > ,
Pred, Proj1, Proj2 >
ranges:: safe_iterator_t < R1 > search ( R1 && r1, R2 && r2, Pred pred = Pred { } ,

Proj1 proj1 = Proj1 { } , Proj2 proj2 = Proj2 { } ) ;
(2) (ranges TS)
1) 在范围 [ first1 , last1 ) 中搜索元素序列 [ first2 , last2 ) 的首次出现。元素分别通过 proj2 proj1 投影后,使用 pred 进行比较。
2) (1) 相同,但使用 r1 作为第一源范围, r2 作为第二源范围,如同使用 ranges:: begin ( r1 ) 作为 first1 ranges:: end ( r1 ) 作为 last1 ranges:: begin ( r2 ) 作为 first2 ,以及 ranges:: end ( r2 ) 作为 last2

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

目录

参数

first1, last1 - 要检查的元素范围
r1 - 要检查的元素范围
first2, last2 - 要搜索的元素范围
r2 - 要搜索的元素范围
pred - 应用于投影元素的谓词
proj1 - 应用于第一个范围元素的投影
proj2 - 应用于第二个范围元素的投影

返回值

指向范围 [ first1 , last1 ) 中首次出现序列 [ first2 , last2 ) 起始位置的迭代器。若 [ first2 , last2 ) 为空序列,则返回 first1 。若未找到该序列,则返回与 last1 相等的迭代器。

复杂度

最多应用谓词和每个投影 S * N 次,其中 S = last2 - first2 N = last1 - first1

可能的实现

template<ForwardIterator I1, Sentinel<I1> S1,
         ForwardIterator I2, Sentinel<I2> S2, class Pred = ranges::equal_to<>,
         class Proj1 = ranges::identity, class Proj2 = ranges::identity>
    requires IndirectlyComparable<I1, I2, Pred, Proj1, Proj2>
I1 search(I1 first1, S1 last1, I2 first2, S2 last2,
          Pred pred = Pred{}, Proj1 proj1 = Proj1{}, Proj2 proj2 = Proj2{})
{
    for (; ; ++first1)
    {
        I1 it = first1;
        for (I2 it2 = first2; ; (void)++it, (void)++it2)
        {
            if (it2 == last2)
                return first1;
            if (it == last1)
                return it;
            if (!ranges::invoke(pred, ranges::invoke(proj1, *it),
                                      ranges::invoke(proj2, *it2)))
                break;
        }
    }
}

示例

参见

搜索元素范围的首次出现
(函数模板)
在特定范围内查找元素的最后序列
(函数模板)
若一个集合是另一个的子集则返回 true
(函数模板)
判断两个元素集合是否相同
(函数模板)
查找首个满足特定条件的元素
(函数模板)
若一个范围按字典序小于另一个则返回 true
(函数模板)
查找两个范围首次出现不同的位置
(函数模板)
在范围中搜索连续重复指定次数的元素
(函数模板)