类别:算法 | 组件类型:函数 |
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);
第一个版本的搜索返回第一个迭代器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).
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,但这样的搜索将始终失败。