std::find_first_of

Header: <algorithm>

Searches the range [first,last) for any of the elements in the range [s_first,s_last).

# Declarations

template< class InputIt, class ForwardIt >
InputIt find_first_of( InputIt first, InputIt last,
ForwardIt s_first, ForwardIt s_last );

(constexpr since C++20)

template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 >
ForwardIt1 find_first_of( ExecutionPolicy&& policy,
ForwardIt1 first, ForwardIt1 last,
ForwardIt2 s_first, ForwardIt2 s_last );

(since C++17)

template< class InputIt, class ForwardIt, class BinaryPred >
InputIt find_first_of( InputIt first, InputIt last,
ForwardIt s_first, ForwardIt s_last,
BinaryPred p );

(constexpr since C++20)

template< class ExecutionPolicy,
class ForwardIt1, class ForwardIt2, class BinaryPred >
ForwardIt1 find_first_of( ExecutionPolicy&& policy,
ForwardIt1 first, ForwardIt last,
ForwardIt2 s_first, ForwardIt2 s_last,
BinaryPred p );

(since C++17)

# Parameters

# 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).

# Example

#include <algorithm>
#include <iostream>
#include <vector>
 
auto print_sequence = [](const auto id, const auto& seq, int pos = -1)
{
    std::cout << id << "{ ";
    for (int i{}; auto const& e : seq)
    {
        const bool mark{i == pos};
        std::cout << (i++ ? ", " : "");
        std::cout << (mark ? "[ " : "") << e << (mark ? " ]" : "");
    }
    std::cout << " }\n";
};
 
int main()
{
    const std::vector<int> v{0, 2, 3, 25, 5};
    const auto t1 = {19, 10, 3, 4};
    const auto t2 = {1, 6, 7, 9};
 
    auto find_any_of = [](const auto& v, const auto& t)
    {
        const auto result = std::find_first_of(v.begin(), v.end(),
                                               t.begin(), t.end());
        if (result == v.end())
        {
            std::cout << "No elements of v are equal to any element of ";
            print_sequence("t = ", t);
            print_sequence("v = ", v);
        }
        else
        {
            const auto pos = std::distance(v.begin(), result);
            std::cout << "Found a match (" << *result << ") at position " << pos;
            print_sequence(", where t = ", t);
            print_sequence("v = ", v, pos);
        }
    };
 
    find_any_of(v, t1);
    find_any_of(v, t2);
}

# Defect reports

DRApplied toBehavior as publishedCorrect behavior
LWG 576C++98first and last needed to be LegacyForwardIteratorsthey only need to beLegacyInputIterators
LWG 1205C++98the return value was unclear if [s_first, s_last) is emptyreturns last in this case

# See also