std::find_first_of

From Cppreference

Jump to: navigation, search
Defined in header <algorithm>

template< class ForwardIterator1, class ForwardIterator2 >

ForwardIterator1 find_first_of( ForwardIterator1 first, ForwardIterator1 last,

                                ForwardIterator2 s_first, ForwardIterator2 s_last );
(1)
template< class ForwardIterator1, class ForwardIterator2, class BinaryPredicate >

ForwardIterator1 find_first_of( ForwardIterator1 first, ForwardIterator1 last,

                                ForwardIterator2 s_first, ForwardIterator2 s_last, BinaryPredicate p );
(2)

Searches the range [first, last) for any of the elements in the range [s_first, s_last). The first version uses operator== to compare the elements, the second version uses the given binary predicate p.

Contents

Parameters

first, last - the range of elements to examine
s_first, s_last - the range of elements to search for
p - binary predicate which returns ​true if the elements should be treated as equal.

The signature of the predicate function should be equivalent to the following:

bool pred(const Type1 &a, const Type2 &b);

The signature does not need to have const &, but the function must not modify the objects passed to it.
The types ​Type1​ and ​Type2​ must be such that objects of types ​ForwardIterator1​ and ​ForwardIterator2​ can be dereferenced and then implicitly converted to ​Type1​ and ​Type2​ respectively.

Return value

iterator to the first element in the range [first, last) that is equal to an element from the range [s_first; s_last). If no such element is found, last is returned.

Complexity

does at most S*N) comparisons where ​S = distance(s_first, s_last) and ​N = distance(first, last).

Equivalent function

First version:
template<class ForwardIterator1, class ForwardIterator2>
ForwardIterator1 find_first_of(ForwardIterator1 first, ForwardIterator1 last,
                               ForwardIterator2 s_first, ForwardIterator2 s_last)
{
    for (; first != last; ++first) {
        for (ForwardIterator2 it = sfirst; it != s_last; ++it) {
            if (*first == *it) {
                return first;
            }
        }
    }
    return last;
}
Second version:
template<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
ForwardIterator1 find_first_of(ForwardIterator1 first, ForwardIterator1 last,
                               ForwardIterator2 s_first, ForwardIterator2 s_last, BinaryPredicate p)
{
    for (; first != last; ++first) {
        for (ForwardIterator2 it = sfirst; it != s_last; ++it) {
            if (p(*first, *it)) {
                return first;
            }
        }
    }
    return last;
}

Example

The following code searches for a 9, 4, or 7 in an array of integers:

#include <algorithm>
#include <iostream>
 
int main()
{
    int nums[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    int* result;
    int end = 10;
 
    int targets[] = { 9, 4, 7 };
    int target_end;
 
    result = std::find_first_of(nums, nums + end, targets, targets + targets_end);
    if (*result == nums[end]) {
        std::cout << "any of { 9, 4, 7 } not found";
    } else {
        std::cout << "found a match at " << result - nums;
    }
 
    return 0;
}

Output:

​found a match at 4​

See also

find
find_if
find_if_not


(C++0x)
finds the first element satisfying specific criteria
(function template)
Personal tools
Namespaces
Variants
Actions
Navigation
Toolbox
In other languages