std::experimental::ranges::search
template< ForwardIterator I1, Sentinel<I1> S1, ForwardIterator I2, Sentinel<I2> S2, class Pred = ranges::equal_to<>, |
(1) | (范围 TS) |
template< ForwardRange R1, ForwardRange R2, class Pred = ranges::equal_to<>, class Proj1 = ranges::identity, class Proj2 = ranges::identity > |
(2) | (范围 TS) |
[
first1,
last1)
中搜索首次出现的元素序列 [
first2,
last2)
。使用 pred 对分别以 proj2 和 proj1 投射后的元素进行比较。尽管声明描述如上,算法声明的模板形参的实际数量和顺序是未指定的。从而若在调用算法时使用显式模板实参,则程序很可能不可移植。
Parameters
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 (函数模板) | |
寻找两个范围出现不同的首个位置 (函数模板) | |
在范围中搜索一定量的某个元素的连续副本 (函数模板) |