std::adjacent_find
在标头 <algorithm> 定义
|
||
(1) | ||
template< class ForwardIt > ForwardIt adjacent_find( ForwardIt first, ForwardIt last ); |
(C++20 前) | |
template< class ForwardIt > constexpr ForwardIt adjacent_find( ForwardIt first, ForwardIt last ); |
(C++20 起) | |
template< class ExecutionPolicy, class ForwardIt > ForwardIt adjacent_find( ExecutionPolicy&& policy, |
(2) | (C++17 起) |
(3) | ||
template< class ForwardIt, class BinaryPredicate> ForwardIt adjacent_find( ForwardIt first, ForwardIt last, BinaryPredicate p ); |
(C++20 前) | |
template< class ForwardIt, class BinaryPredicate> constexpr ForwardIt adjacent_find( ForwardIt first, ForwardIt last, |
(C++20 起) | |
template< class ExecutionPolicy, class ForwardIt, class BinaryPredicate> ForwardIt adjacent_find( ExecutionPolicy&& policy, |
(4) | (C++17 起) |
在范围 [first, last)
中搜索两个连续的相等元素。
operator==
比较元素。
std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> |
(C++20 前) |
std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>> |
(C++20 起) |
参数
first, last | - | 要检验的元素范围 |
policy | - | 所用的执行策略。细节见执行策略。 |
p | - | 若元素应被当做相等则返回 true 的二元谓词。 谓词函数的签名应等价于如下: bool pred(const Type1 &a, const Type2 &b); 虽然签名不必有 const & ,函数也不能修改传递给它的对象,而且必须接受(可为 const 的)类型 |
类型要求 | ||
-ForwardIt 必须符合老式向前迭代器 (LegacyForwardIterator) 的要求。
|
返回值
指向首对等同元素的首个元素的迭代器,即首个满足 *it == *(it + 1)(第一版本)或 p(*it, *(it + 1)) != false(第三版本)的迭代器 it。
如果找不到这种元素,那么返回 last。
复杂度
O(last - first)
次对应的谓词。异常
拥有名为 ExecutionPolicy
的模板形参的重载按下列方式报告错误:
- 如果作为算法一部分调用的函数的执行抛出异常,且
ExecutionPolicy
是标准策略之一,那么调用 std::terminate。对于任何其他ExecutionPolicy
,行为由实现定义。 - 如果算法无法分配内存,那么抛出 std::bad_alloc。
可能的实现
版本一 |
---|
template<class ForwardIt> ForwardIt adjacent_find(ForwardIt first, ForwardIt last) { if (first == last) return last; ForwardIt next = first; ++next; for (; next != last; ++next, ++first) if (*first == *next) return first; return last; } |
版本三 |
template<class ForwardIt, class BinaryPredicate> ForwardIt adjacent_find(ForwardIt first, ForwardIt last, BinaryPredicate p) { if (first == last) return last; ForwardIt next = first; ++next; for (; next != last; ++next, ++first) if (p(*first, *next)) return first; return last; } |
示例
#include <algorithm> #include <iostream> #include <vector> #include <functional> int main() { std::vector<int> v1{0, 1, 2, 3, 40, 40, 41, 41, 5}; auto i1 = std::adjacent_find(v1.begin(), v1.end()); if (i1 == v1.end()) std::cout << "没有匹配的相邻元素\n"; else std::cout << "第一对相等的相邻元素位于 " << std::distance(v1.begin(), i1) << ",*i1 = " << *i1 << '\n'; auto i2 = std::adjacent_find(v1.begin(), v1.end(), std::greater<int>()); if (i2 == v1.end()) std::cout << "整个 vector 已经是升序的\n"; else std::cout << "非降序子序列中最后的元素位于 " << std::distance(v1.begin(), i2) << ",*i2 = " << *i2 << '\n'; }
输出:
第一对相等的相邻元素位于 4,*i1 = 40 非降序子序列中最后的元素位于 7,*i2 = 41
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 240 | C++98 | (1,3) 中谓词会应用 std::find(first, last, value) - first 次,但 value 没有定义 |
应用 std::min((result - first) + 1, (last - first) - 1) 次 |
参阅
移除范围内的连续重复元素 (函数模板) | |
(C++20) |
查找首对相邻的相同(或满足给定谓词的)元素 (niebloid) |