STL algorithm算法(01):adjacent_find

STL algorithm算法(01):adjacent_find

这段时间非常苦恼,看完基本的C++语法知识入门后,没有找到进一步提高的路径,数据结构与算法看的十分吃力,进度缓慢,算是进入瓶颈期了,而且手头上没有可以实践提高的项目。思索下来,STL模板库作为C++的一个重要工具,我只对其容器类有较多的了解,对于算法部分比较陌生,加上这段实践有闲,所以就看看C++官网的介绍,翻译下来,也是学习提高的一种方式。
adjacent意为邻近的。adjacent_find就是在一个数组中寻找两个相邻且相等的元素,如果相等,就返回这两个相等元素第一一个元素的迭代器,不等的话就返回迭代器end()。
函数的调用类型又如下两种:

  • equality (1)
    template
    ForwardIterator adjacent_find (ForwardIterator first, ForwardIterator last);
  • predicate (2)
    template
    ForwardIterator adjacent_find (ForwardIterator first, ForwardIterator last, BinaryPredicate pred);

第一个很好理解,第二个看起来比较复杂,不过没关系,后面结合例子就明白了。
Find equal adjacent elements in range

这个函数的作用就是寻找一段范围内相等而且相邻的元素

Searches the range [first,last) for the first occurrence of two consecutive elements that match, and returns an iterator to the first of these two elements, or last if no such pair is found.
在前闭后开的空间范围内搜寻,找到第一次出现的两个相等且相邻的元素。如果存在符合条件的元素就返回指向第一个元素的迭代器,否则返回end()。

Two elements match if they compare equal using operator== (or using pred, in version (2)).

用“==”运算符对两个元素的关系进行判定,在第二个调用方式中,可以用自定义的“谓语”来判定。

The behavior of this function template is equivalent to:

这个模块函数的效果大致与下面的函数相等:

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;
}

Parameters
参量说明:

first, lastForward iterators to the initial and final positions of the searched sequence. The range used is [first,last), which contains all the elements between first and last, including the element pointed by first but not the element pointed by last.   这两个表示呗检索元素的范围,包含first所指向的元素但是不包括last所指向的元素

predBinary function that accepts two elements as arguments, and returns a value convertible to bool. The returned value indicates whether the elements are considered to match in the context of this function.
The function shall not modify any of its arguments.
This can either be a function pointer or a function object.   二元函数是指接受两个元素作为参量并且返回值为布尔型的函数。这个返回值表明了元素是否符合我们限定的要求。
  这个函数不能修改其参量的值。

 这个参量也可以是一个函数指针或者函数对象。

Example

// 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;
}
Comments are closed.