◐ Shell
clean mode source ↗

std::find, std::find_if, std::find_if_not - cppreference.com

Defined in header <algorithm>

template< class InputIt, class T >
InputIt find( InputIt first, InputIt last, const T& value );
(1) (constexpr since C++20)
(until C++26)
template< class InputIt, class T = typename std::iterator_traits
                                       <InputIt>::value_type >
constexpr InputIt find( InputIt first, InputIt last, const T& value );
(since C++26)
template< class InputIt, class UnaryPred >
InputIt find_if( InputIt first, InputIt last, UnaryPred p );
(2) (constexpr since C++20)
template< class InputIt, class UnaryPred >
InputIt find_if_not( InputIt first, InputIt last, UnaryPred q );
(3) (since C++11)
(constexpr since C++20)
template< class ExecutionPolicy, class ForwardIt, class T >
ForwardIt find( ExecutionPolicy&& policy,
                ForwardIt first, ForwardIt last, const T& value );
(4) (since C++17)
(until C++26)
template< class ExecutionPolicy,
          class ForwardIt, class T = typename std::iterator_traits
                                         <ForwardIt>::value_type >
ForwardIt find( ExecutionPolicy&& policy,
                ForwardIt first, ForwardIt last, const T& value );
(since C++26)
template< class ExecutionPolicy, class ForwardIt, class UnaryPred >
ForwardIt find_if( ExecutionPolicy&& policy,
                   ForwardIt first, ForwardIt last, UnaryPred p );
(5) (since C++17)
template< class ExecutionPolicy, class ForwardIt, class UnaryPred >
ForwardIt find_if_not( ExecutionPolicy&& policy,
                       ForwardIt first, ForwardIt last, UnaryPred q );
(6) (since C++17)

Returns an iterator to the first element in the source range [firstlast) that satisfies specific criteria (or last if there is no such iterator).

1) find searches for the first element equal to value (using operator==).

2) find_if searches for the first element for which predicate p returns true.

3) find_if_not searches for the first element for which predicate q returns false.

4-6) Same as (1-3), but executed according to policy.

These overloads participate in overload resolution only if the value of the following expression is true:

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>

(until C++20)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>

(since C++20)

Parameters

first, last - the pair of iterators defining the source range
value - value to compare the elements to
p - unary predicate which returns ​true for the required element.

The expression p(v) must be convertible to bool for every argument v of type (possibly const) VT, where VT is the value type of InputIt, regardless of value category, and must not modify v. Thus, a parameter type of VT&is not allowed, nor is VT unless for VT a move is equivalent to a copy(since C++11). ​

q - unary predicate which returns ​false for the required element.

The expression q(v) must be convertible to bool for every argument v of type (possibly const) VT, where VT is the value type of InputIt, regardless of value category, and must not modify v. Thus, a parameter type of VT&is not allowed, nor is VT unless for VT a move is equivalent to a copy(since C++11). ​

policy - the execution policy to use
Type requirements
-InputIt must meet the requirements of LegacyInputIterator.
-ForwardIt must meet the requirements of LegacyForwardIterator.
-UnaryPredicate must meet the requirements of Predicate.

Return value

The first iterator it in the source range satisfying the following condition or last if there is no such iterator:

1,4) *it == value is true.

2,5) p(*it) is true.

3,6) q(*it) is false.

Complexity

Given N as std::distance(first, last):

1) At most N comparisons with value using operator==.

2) At most N applications of p.

3) At most N applications of q.

4) 𝓞(N) comparisons with value using operator==.

5) 𝓞(N) applications of p.

6) 𝓞(N) applications of q.

Exceptions

4-6) During the execution process:

  • If the temporary memory resources required for parallelization are not available, std::bad_alloc is thrown.
  • If an uncaught exception is thrown while accessing objects via an algorithm argument, the behavior is determined by the execution policy (for standard policies, std::terminate is invoked).

Possible implementation

find
template<class InputIt, class T = typename std::iterator_traits<InputIt>::value_type>
constexpr InputIt find(InputIt first, InputIt last, const T& value)
{
    for (; first != last; ++first)
        if (*first == value)
            return first;
    
    return last;
}
find_if
template<class InputIt, class UnaryPred>
constexpr InputIt find_if(InputIt first, InputIt last, UnaryPred p)
{
    for (; first != last; ++first)
        if (p(*first))
            return first;
    
    return last;
}
find_if_not
template<class InputIt, class UnaryPred>
constexpr InputIt find_if_not(InputIt first, InputIt last, UnaryPred q)
{
    for (; first != last; ++first)
        if (!q(*first))
            return first;
    
    return last;
}

Notes

If C++11 is not available, an equivalent to std::find_if_not is to use std::find_if with the negated predicate.

template<class InputIt, class UnaryPred>
InputIt find_if_not(InputIt first, InputIt last, UnaryPred q)
{
    return std::find_if(first, last, std::not1(q));
}
Feature-test macro Value Std Feature
__cpp_lib_algorithm_default_value_type 202403 (C++26) List-initialization for algorithms (1,4)

Example

The following example finds numbers in given sequences.

#include <algorithm>
#include <array>
#include <cassert>
#include <complex>
#include <initializer_list>
#include <iostream>
#include <vector>

bool is_even(int i)
{
    return i % 2 == 0;
}

void example_contains()
{
    const auto haystack = {1, 2, 3, 4};
    
    for (const int needle : {3, 5})
        if (std::find(haystack.begin(), haystack.end(), needle) == haystack.end())
            std::cout << "haystack does not contain " << needle << '\n';
        else
            std::cout << "haystack contains " << needle << '\n';
}

void example_predicate()
{
    for (const auto& haystack : {std::array{3, 1, 4}, {1, 3, 5}})
    {
        const auto it = std::find_if(haystack.begin(), haystack.end(), is_even);
        if (it != haystack.end())
            std::cout << "haystack contains an even number " << *it << '\n';
        else
            std::cout << "haystack does not contain even numbers\n";
    }
}

void example_list_init()
{
    std::vector<std::complex<double>> haystack{{4.0, 2.0}};
#ifdef __cpp_lib_algorithm_default_value_type
    // T gets deduced making list-initialization possible
    const auto it = std::find(haystack.begin(), haystack.end(), {4.0, 2.0});
#else
    const auto it = std::find(haystack.begin(), haystack.end(), std::complex{4.0, 2.0});
#endif
    assert(it == haystack.begin());  
}

int main()
{
    example_contains();
    example_predicate();
    example_list_init();
}

Output:

haystack contains 3
haystack does not contain 5
haystack contains an even number 4
haystack does not contain even numbers

Defect reports

The following behavior-changing defect reports were applied retroactively to previously published C++ standards.

DR Applied to Behavior as published Correct behavior
LWG 283 C++98 T was required to be EqualityComparable, but
the value type of InputIt might not be T
removed the requirement

See also

finds the first element satisfying specific criteria
(algorithm function object)[edit]
finds the first two adjacent items that are equal (or satisfy a given predicate)
(function template & algorithm function object)[edit]
finds the last sequence of elements in a certain range
(function template & algorithm function object)[edit]
searches for any one of a set of elements
(function template & algorithm function object)[edit]
finds the first position where two ranges differ
(function template & algorithm function object)[edit]
searches for the first occurrence of a range of elements
(function template & algorithm function object)[edit]