std::experimental::ranges::adjacent_find
来自cppreference.com
< cpp | experimental | ranges
template< ForwardIterator I, Sentinel<I> S, class Proj = ranges::identity, IndirectRelation<projected<I, Proj>> Pred = ranges::equal_to<> > |
(1) | (范围 TS) |
template< ForwardRange R, class Proj = ranges::identity, IndirectRelation<projected<ranges::iterator_t<R>, Proj>> Pred = ranges::equal_to<> > |
(2) | (范围 TS) |
1) 在范围
[
first,
last)
中搜索两个连续的相同元素。在以 proj 投射后使用 pred 来比较元素。尽管声明描述如上,算法声明的模板形参的实际数量和顺序是未指定的。从而若在调用算法时使用显式模板实参,则程序很可能不可移植。
参数
first, last | - | 要检验的元素范围 |
r | - | 要检验的元素范围 |
pred | - | 用于比较投射后元素的谓词 |
proj | - | 运用于元素的投射 |
返回值
指向第一对相同元素中前者的迭代器,即首个使得 i
和 i + 1
均在范围 [
first,
last)
中且 ranges::invoke(pred, ranges::invoke(proj, *i), ranges::invoke(proj, *(i + 1))) != false 的迭代器 i
。
如果未找到这种元素,则返回与 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; } |
示例
本节未完成 原因:暂无示例 |
参阅
查找首对相邻的相同(或满足给定谓词的)元素 (函数模板) | |
移除范围中连续的重复元素 (函数模板) |