std::experimental::ranges::adjacent_find

来自cppreference.com
< cpp‎ | experimental‎ | ranges
 
 
实验性
技术规范
文件系统库(文件系统 TS)
库基础(库基础 TS)
库基础 2(库基础 TS v2)
库基础 3(库基础 TS v3)
并行扩展(并行 TS)
并行扩展 2(并行 TS v2)
并发扩展(并发 TS)
并发扩展 2(并发 TS v2)
概念(概念 TS)
范围(范围 TS)
反射(反射 TS)
数学特殊函数(特殊函数 TR)
实验性非 TS 功能特性
模式匹配
线性代数
std::execution
契约
2D 图形
 
 
 
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) (范围 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) (范围 TS)
1) 在范围 [firstlast) 中搜索两个连续的相同元素。在以 proj 投射后使用 pred 来比较元素。
2)(1) 相同,但使用 r 为源范围,如同以 ranges::begin(r)first 并以 ranges::end(r)last

尽管声明描述如上,算法声明的模板形参的实际数量和顺序是未指定的。从而若在调用算法时使用显式模板实参,则程序很可能不可移植。

目录

[编辑]参数

first, last - 要检验的元素范围
r - 要检验的元素范围
pred - 用于比较投射后元素的谓词
proj - 运用于元素的投射

[编辑]返回值

指向第一对相同元素中前者的迭代器,即首个使得 ii + 1 均在范围 [firstlast) 中且 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;}

[编辑]示例

[编辑]参阅

查找首对相同(或满足给定谓词)的相邻元素
(函数模板)[编辑]
移除范围中连续的重复元素
(函数模板)[编辑]
close