SGI

搜索

类别:算法 组件类型:函数

原型

搜索是一个重载名称;实际上有两个搜索函数。
template <class ForwardIterator1, class ForwardIterator2>
ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1,
                        ForwardIterator2 first2, ForwardIterator2 last2);

template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
ForwardIterator1 search(ForwardIterator1 first1, ForwardIterator1 last1,
                        ForwardIterator2 first2, ForwardIterator2 last2,
                        BinaryPredicate binary_pred);

描述

搜索在范围内查找子序列[first1, last1)[first2, last2)相同,逐元素比较。它返回一个指向该子序列开头的迭代器,或者last1如果不存在这样的子序列。这两个版本搜索在如何确定两个元素是否相同方面有所不同:第一个使用operator==,第二个使用用户提供的函数对象binary_pred.

第一个版本的搜索返回第一个迭代器i在范围内[first1, last1 - (last2 - first2)) [1],使得对于每个迭代器j在范围内[first2, last2), *(i + (j - first2)) == *j。第二个版本返回第一个迭代器i[first1, last1 - (last2 - first2))中,使得对于每个迭代器j[first2, last2), binary_pred(*(i + (j - first2)), *j)true。这些条件仅仅意味着以i开头的子范围中的每个元素都必须与[first2, last2).

中的对应元素相同。

定义

在标准头文件algorithm中定义,并在非标准向后兼容头文件algo.h中定义。

类型要求对于第二个版本

先决条件

复杂度

最坏情况下的行为是二次的:最多(last1 - first1) * (last2 - first2)次比较。然而,这种最坏情况很少见。平均复杂度是线性的。

示例

  const char S1[] = "Hello, world!";
  const char S2[] = "world";
  const int N1 = sizeof(S1) - 1;
  const int N2 = sizeof(S2) - 1;

  const char* p = search(S1, S1 + N1, S2, S2 + N2);
  printf("Found subsequence \"%s\" at character %d of sequence \"%s\".\n",
         S2, p - S1, S1);

注释

[1] 这个范围是[first1, last1 - (last2 - first2)),而不是简单的[first1, last1),原因是我们正在寻找一个等于完整序列的子序列[first2, last2)。迭代器i除非last1 - i大于或等于last2 - first2,否则不能是此类子序列的开头。请注意这一点的含义:您可以使用参数调用搜索,使得last1 - first1小于last2 - first2,但这样的搜索将始终失败。

另请参阅

查找, 查找_if, 查找_end, 搜索_n, 不匹配, 相等
[Silicon Surf] [STL Home]
版权所有 © 1999 Silicon Graphics, Inc. 保留所有权利。 商标信息