std::experimental::ranges::search_n
来自cppreference.com
<tbody>
</tbody>
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) | (范围 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) | (范围 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)
// success
return candidate;
++first;
if (first == last)
// exhausted the list
return first;
if (!ranges::invoke(pred, ranges::invoke(proj, *first), value))
// too few in a row
break;
}
}
return first;
}
|
示例
| 本节未完成 原因:暂无示例 |
参阅
| 搜索元素在范围中首次连续若干次出现 (函数模板) | |
| 在特定范围中寻找最后出现的元素序列 (函数模板) | |
| 寻找首个满足特定判别标准的元素 (函数模板) | |
| 搜索一个元素范围 (函数模板) |