函数模板
<algorithm>

std::find_first_of

相等 (1)
template <class ForwardIterator1, class ForwardIterator2>   ForwardIterator1 find_first_of (ForwardIterator1 first1, ForwardIterator1 last1,                                   ForwardIterator2 first2, ForwardIterator2 last2);
谓词 (2)
template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>   ForwardIterator1 find_first_of (ForwardIterator1 first1, ForwardIterator1 last1,                                   ForwardIterator2 first2, ForwardIterator2 last2,                                   BinaryPredicate pred);
相等 (1)
template <class InputIterator, class ForwardIterator>   InputIterator find_first_of (InputIterator first1, InputIterator last1,                                   ForwardIterator first2, ForwardIterator last2);
谓词 (2)
template <class InputIterator, class ForwardIterator, class BinaryPredicate>   InputIterator find_first_of (InputIterator first1, InputIterator last1,                                   ForwardIterator first2, ForwardIterator last2,                                   BinaryPredicate pred);
从集合中查找范围内的元素
返回一个迭代器,指向范围 [first1,last1) 中与 [first2,last2) 中的任意元素匹配的第一个元素。如果未找到此类元素,则函数返回 last1

范围 [first1,last1) 中的元素将使用 operator==(或版本 (2) 中的 pred)依次与 [first2,last2) 中的每个值进行比较,直到找到一对匹配项。

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

参数

first1, last1
正向迭代器,指向被搜索序列的起始和结束位置。使用的范围是 [first1,last1),它包含 first1last1 之间的所有元素,包括 first1 指向的元素,但不包括 last1 指向的元素。
输入迭代器,指向被搜索序列的起始和结束位置。使用的范围是 [first1,last1),它包含 first1last1 之间的所有元素,包括 first1 指向的元素,但不包括 last1 指向的元素。
first2, last2
正向迭代器,指向要搜索的元素值的起始和结束位置。使用的范围是 [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_first_of example
#include <iostream>     // std::cout
#include <algorithm>    // std::find_first_of
#include <vector>       // std::vector
#include <cctype>       // std::tolower

bool comp_case_insensitive (char c1, char c2) {
  return (std::tolower(c1)==std::tolower(c2));
}

int main () {
  int mychars[] = {'a','b','c','A','B','C'};
  std::vector<char> haystack (mychars,mychars+6);
  std::vector<char>::iterator it;

  int needle[] = {'A','B','C'};

  // using default comparison:
  it = find_first_of (haystack.begin(), haystack.end(), needle, needle+3);

  if (it!=haystack.end())
    std::cout << "The first match is: " << *it << '\n';

  // using predicate comparison:
  it = find_first_of (haystack.begin(), haystack.end(),
                      needle, needle+3, comp_case_insensitive);

  if (it!=haystack.end())
    std::cout << "The first match is: " << *it << '\n';

  return 0;
}

输出
The first match is: A
The first match is: a


复杂度

最多线性于 count1*count2(其中 countXfirstXlastX 之间的距离):比较元素直到找到匹配项。

数据竞争

两个范围中的部分(或全部)对象将被访问(对于 [first1,last1) 最多访问一次,对于 [first2,last2) 可能访问多次)。

异常

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

另见