函数模板
<algorithm>

std::find_end

相等 (1)
template <class ForwardIterator1, class ForwardIterator2>   ForwardIterator1 find_end (ForwardIterator1 first1, ForwardIterator1 last1,                              ForwardIterator2 first2, ForwardIterator2 last2);
谓词 (2)
template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>   ForwardIterator1 find_end (ForwardIterator1 first1, ForwardIterator1 last1,                              ForwardIterator2 first2, ForwardIterator2 last2,                              BinaryPredicate pred);
在范围中查找最后一个子序列
在范围 [first1,last1) 中查找由 [first2,last2) 定义的序列的最后一个出现,并返回指向其第一个元素的迭代器,如果没有找到则返回 last1

这两个范围中的元素通过 operator==(或版本(2)中的 pred)进行顺序比较:仅当 [first2,last2) 的所有元素都满足此条件时,[first1,last1) 的子序列才被视为匹配。

此函数返回最后一次出现。有关返回第一次出现的算法,请参阅 search

此函数模板的行为等同于
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
template<class ForwardIterator1, class ForwardIterator2>
  ForwardIterator1 find_end (ForwardIterator1 first1, ForwardIterator1 last1,
                             ForwardIterator2 first2, ForwardIterator2 last2)
{
  if (first2==last2) return last1;  // specified in C++11

  ForwardIterator1 ret = last1;

  while (first1!=last1)
  {
    ForwardIterator1 it1 = first1;
    ForwardIterator2 it2 = first2;
    while (*it1==*it2) {    // or: while (pred(*it1,*it2)) for version (2)
        ++it1; ++it2;
        if (it2==last2) { ret=first1; break; }
        if (it1==last1) return ret;
    }
    ++first1;
  }
  return ret;
}

参数

first1, last1
Forward iterators 指向被查找序列的初始和最终位置。使用的范围是 [first1,last1),它包含 first1last1 之间的所有元素,包括 first1 指向的元素,但不包括 last1 指向的元素。
first2, last2
Forward iterators 指向要查找的序列的初始和最终位置。使用的范围是 [first2,last2)
对于 (1),两个范围中的元素应为可使用 operator== 进行比较的类型(其中第一个范围的元素为左侧操作数,第二个范围的元素为右侧操作数)。
pred
二元函数,接受两个元素作为参数(分别来自两个序列,顺序相同),并返回一个可转换为 bool 的值。返回的值表示元素是否在函数的上下文中被视为匹配。
该函数不得修改其任何参数。
这可以是指针函数或函数对象。

返回值

指向 [first1,last1)[first2,last2) 最后一次出现的第一个元素的迭代器。
如果未找到序列,函数将返回 last1
如果 [first2,last2) 是一个空范围,结果未定义。
如果 [first2,last2) 是空范围,函数将返回 last1

示例

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
29
30
31
32
// find_end example
#include <iostream>     // std::cout
#include <algorithm>    // std::find_end
#include <vector>       // std::vector

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

int main () {
  int myints[] = {1,2,3,4,5,1,2,3,4,5};
  std::vector<int> haystack (myints,myints+10);

  int needle1[] = {1,2,3};

  // using default comparison:
  std::vector<int>::iterator it;
  it = std::find_end (haystack.begin(), haystack.end(), needle1, needle1+3);

  if (it!=haystack.end())
    std::cout << "needle1 last found at position " << (it-haystack.begin()) << '\n';

  int needle2[] = {4,5,1};

  // using predicate comparison:
  it = std::find_end (haystack.begin(), haystack.end(), needle2, needle2+3, myfunction);

  if (it!=haystack.end())
    std::cout << "needle2 last found at position " << (it-haystack.begin()) << '\n';

  return 0;
}

输出
needle1 last found at position 5
needle2 last found at position 3


复杂度

线性时间,最多为 count2*(1+count1-count2),其中 countXfirstXlastX 之间的 距离:比较元素直到找到最后一个匹配的子序列。

数据竞争

两个范围中的一些(或全部)对象被访问(可能不止一次)。

异常

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

另见