function template
<algorithm>

std::adjacent_find

相等 (1)
template <class ForwardIterator>   ForwardIterator adjacent_find (ForwardIterator first, ForwardIterator last);
predicate (2)
template <class ForwardIterator, class BinaryPredicate>   ForwardIterator adjacent_find (ForwardIterator first, ForwardIterator last,                                  BinaryPredicate pred);
在范围中查找相等的相邻元素
在范围 [first,last) 中搜索第一个出现的两个连续相等的元素,并返回指向这两个元素中第一个元素的迭代器,如果未找到这样的对,则返回 last

如果使用 operator==(或在版本(2)中使用 pred)进行比较,则两个元素匹配。

此函数模板的行为等同于
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template <class ForwardIterator>
   ForwardIterator adjacent_find (ForwardIterator first, ForwardIterator last)
{
  if (first != last)
  {
    ForwardIterator next=first; ++next;
    while (next != last) {
      if (*first == *next)     // or: if (pred(*first,*next)), for version (2)
        return first;
      ++first; ++next;
    }
  }
  return last;
}

参数

first, last
Forward 迭代器,指向被搜索序列的初始和最终位置。使用的范围是 [first,last),它包含 firstlast 之间的所有元素,包括 first 指向的元素,但不包括 last 指向的元素。
pred
二进制函数,接受两个元素作为参数,并返回一个可转换为 bool 的值。返回的值指示在函数上下文中元素是否被视为匹配。
该函数不得修改其任何参数。
这可以是一个函数指针或函数对象。

返回值

指向范围 [first,last) 中第一个匹配的连续元素对的第一个元素的迭代器。
如果未找到这样的对,函数将返回 last

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// adjacent_find example
#include <iostream>     // std::cout
#include <algorithm>    // std::adjacent_find
#include <vector>       // std::vector

bool myfunction (int i, int j) {
  return (i==j);
}

int main () {
  int myints[] = {5,20,5,30,30,20,10,10,20};
  std::vector<int> myvector (myints,myints+8);
  std::vector<int>::iterator it;

  // using default comparison:
  it = std::adjacent_find (myvector.begin(), myvector.end());

  if (it!=myvector.end())
    std::cout << "the first pair of repeated elements are: " << *it << '\n';

  //using predicate comparison:
  it = std::adjacent_find (++it, myvector.end(), myfunction);

  if (it!=myvector.end())
    std::cout << "the second pair of repeated elements are: " << *it << '\n';

  return 0;
}

输出
the first pair of repeated elements are: 30
the second pair of repeated elements are: 10


复杂度

最多与 firstlast 之间的 距离 成线性关系:比较元素直到找到匹配项。

数据竞争

范围 [first,last) 中的一些(或全部)对象被访问(最多一次)。

异常

如果任何元素比较(或pred)抛出异常,或者任何迭代器操作抛出异常,则抛出异常。
请注意,无效参数会导致未定义行为

另见