Namespaces
Variants

std::find, std::find_if, std::find_if_not

De fr.cppreference.net
 
 
Bibliothèque d'algorithmes
Algorithmes contraints et algorithmes sur plages (C++20)
Algorithmes contraints, p.ex. ranges::copy, ranges::sort, ...
Opérations de séquence non modifiantes    
Opérations par lots
(C++17)
Opérations de recherche
Opérations de séquence modifiantes
Opérations de copie
(C++11)
(C++11)
Opérations d'échange
Opérations de transformation
Opérations de génération
Opérations de suppression
Opérations de changement d'ordre
(jusqu'à C++17)(C++11)
(C++20)(C++20)
Opérations d'échantillonnage
(C++17)

Tri et opérations connexes
Opérations de partitionnement
(C++11)    

Opérations de tri
Opérations de recherche binaire
(sur des plages partitionnées)
Opérations sur les ensembles (sur des plages triées)
Opérations de fusion (sur des plages triées)
Opérations de tas
Opérations minimum/maximum
(C++11)
(C++17)
Opérations de comparaison lexicographique
Opérations de permutation


 
Défini dans l'en-tête <algorithm>
template< class InputIt, class T >
InputIt find( InputIt first, InputIt last, const T& value );
(1) (constexpr depuis C++20)
(jusqu'à C++26)
template< class InputIt, class T = typename std::iterator_traits
                                       <InputIt>::value_type >
constexpr InputIt find( InputIt first, InputIt last, const T& value );
(depuis C++26)
template< class InputIt, class UnaryPred >
InputIt find_if( InputIt first, InputIt last, UnaryPred p );
(2) (constexpr depuis C++20)
template< class InputIt, class UnaryPred >
InputIt find_if_not( InputIt first, InputIt last, UnaryPred q );
(3) (depuis C++11)
(constexpr depuis C++20)
template< class ExecutionPolicy, class ForwardIt, class T >
ForwardIt find( ExecutionPolicy&& policy,
                ForwardIt first, ForwardIt last, const T& value );
(4) (depuis C++17)
(jusqu'à 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 );
(depuis C++26)
template< class ExecutionPolicy, class ForwardIt, class UnaryPred >
ForwardIt find_if( ExecutionPolicy&& policy,
                   ForwardIt first, ForwardIt last, UnaryPred p );
(5) (depuis C++17)
template< class ExecutionPolicy, class ForwardIt, class UnaryPred >
ForwardIt find_if_not( ExecutionPolicy&& policy,
                       ForwardIt first, ForwardIt last, UnaryPred q );
(6) (depuis C++17)

Renvoie un itérateur vers le premier élément dans la plage source [firstlast) qui satisfait des critères spécifiques (ou last s'il n'y a pas un tel itérateur).

1) find recherche le premier élément égal à value (en utilisant operator==).
2) find_if recherche le premier élément pour lequel le prédicat p renvoie true.
3) find_if_not recherche le premier élément pour lequel le prédicat q renvoie false.
4-6) Identique à (1-3), mais exécuté selon policy.
Ces surcharges participent à la résolution de surcharge uniquement si la valeur de l'expression suivante est true:

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

(jusqu'à C++20)

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

(depuis C++20)

Paramètres

first, last - la paire d'itérateurs définissant la plage source
value - valeur à laquelle comparer les éléments
p - prédicat unaire qui renvoie ​true pour l'élément requis.

L'expression p(v) doit être convertible en bool pour chaque argument v de type (éventuellement const) VT, où VT est le type valeur de InputIt, indépendamment de la catégorie de valeur, et ne doit pas modifier v. Ainsi, un type de paramètre VT&n'est pas autorisé, ni VT sauf si pour VT un déplacement est équivalent à une copie(depuis C++11). ​

q - prédicat unaire qui renvoie ​false pour l'élément requis.

L'expression q(v) doit être convertible en bool pour chaque argument v de type (éventuellement const) VT, où VT est le type valeur de InputIt, indépendamment de la catégorie de valeur, et ne doit pas modifier v. Ainsi, un type de paramètre VT&n'est pas autorisé, ni VT sauf si pour VT un déplacement est équivalent à une copie(depuis C++11). ​

policy - la politique d'exécution à utiliser
Exigences de type
-
InputIt doit satisfaire aux exigences de LegacyInputIterator.
-
ForwardIt doit satisfaire aux exigences de LegacyForwardIterator.
-
UnaryPredicate doit satisfaire aux exigences de Predicate.

Valeur de retour

Le premier itérateur it dans la plage source satisfaisant la condition suivante ou last s'il n'y a pas un tel itérateur :

1,4) *it == value est true.
2,5) p(*it) est true.
3,6) q(*it) est false.

Complexité

Soit N comme std::distance(first, last):

1) Au plus N comparaisons avec value en utilisant operator==.
2) Au plus N applications de p.
3) Au plus N applications de q.
4) 𝓞(N) comparaisons avec value en utilisant operator==.
5) 𝓞(N) applications de p.
6) 𝓞(N) applications de q.

Exceptions

4-6) Pendant le processus d'exécution :
  • Si les ressources mémoire temporaires nécessaires à la parallélisation ne sont pas disponibles, std::bad_alloc est levée.
  • Si une exception non attrapée est levée lors de l'accès à des objets via un argument d'algorithme, le comportement est déterminé par la politique d'exécution (pour les politiques standard, std::terminate est invoqué).

Implémentation possible

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

Si C++11 n'est pas disponible, un équivalent à std::find_if_not est d'utiliser std::find_if avec le prédicat nié.

template<class InputIt, class UnaryPred>
InputIt find_if_not(InputIt first, InputIt last, UnaryPred q)
{
    return std::find_if(first, last, std::not1(q));
}
Macro de test de fonctionnalité Valeur Std Fonctionnalité
__cpp_lib_algorithm_default_value_type 202403 (C++26) Initialisation par liste pour les algorithmes (1,4)

Exemple

L'exemple suivant trouve des nombres dans des séquences données.

#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();
}

Sortie :

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

Rapports de défauts

Les rapports de défauts suivants modifiant le comportement ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR Appliqué à Comportement tel que publié Comportement correct
LWG 283 C++98 T était requis d'être EqualityComparable, mais
le type valeur de InputIt pourrait ne pas être T
a supprimé l'exigence

Voir aussi

trouve le premier élément satisfaisant des critères spécifiques
(objet fonction d'algorithme)
trouve les deux premiers éléments adjacents qui sont égaux (ou satisfont un prédicat donné)
(template de fonction & objet fonction d'algorithme)
trouve la dernière séquence d'éléments dans une certaine plage
(template de fonction & objet fonction d'algorithme)
recherche l'un quelconque d'un ensemble d'éléments
(template de fonction & objet fonction d'algorithme)
trouve la première position où deux plages diffèrent
(template de fonction & objet fonction d'algorithme)
recherche la première occurrence d'une plage d'éléments
(template de fonction & objet fonction d'algorithme)