Namespaces
Variants

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

From cppreference.net
Algorithm library
Constrained algorithms and algorithms on ranges (C++20)
Constrained algorithms, e.g. ranges::copy , ranges::sort , ...
Execution policies (C++17)
Non-modifying sequence operations
Batch operations
(C++17)
Search operations
Modifying sequence operations
Copy operations
(C++11)
(C++11)
Swap operations
Transformation operations
Generation operations
Removing operations
Order-changing operations
(until C++17) (C++11)
(C++20) (C++20)
Sampling operations
(C++17)

Sorting and related operations
Partitioning operations
Sorting operations
Binary search operations
(on partitioned ranges)
Set operations (on sorted ranges)
Merge operations (on sorted ranges)
Heap operations
Minimum/maximum operations
Lexicographical comparison operations
Permutation operations
C library
Numeric operations
Operations on uninitialized memory
Défini dans l'en-tête <algorithm>
(1)
template < class InputIt, class T >
InputIt find ( InputIt first, InputIt last, const T & value ) ;
(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)
(2)
template < class ExecutionPolicy, class ForwardIt, class T >

ForwardIt find ( ExecutionPolicy && policy,

ForwardIt first, ForwardIt last, const T & value ) ;
(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 InputIt, class UnaryPred >
InputIt find_if ( InputIt first, InputIt last, UnaryPred p ) ;
(3) (constexpr depuis C++20)
template < class ExecutionPolicy, class ForwardIt, class UnaryPred >

ForwardIt find_if ( ExecutionPolicy && policy,

ForwardIt first, ForwardIt last, UnaryPred p ) ;
(4) (depuis C++17)
template < class InputIt, class UnaryPred >
InputIt find_if_not ( InputIt first, InputIt last, UnaryPred q ) ;
(5) (depuis C++11)
(constexpr depuis C++20)
template < class ExecutionPolicy, class ForwardIt, class UnaryPred >

ForwardIt find_if_not ( ExecutionPolicy && policy,

ForwardIt first, ForwardIt last, UnaryPred q ) ;
(6) (depuis C++17)

Retourne un itérateur vers le premier élément de la plage [ first , last ) qui satisfait des critères spécifiques (ou last s'il n'existe pas un tel itérateur).

1) find recherche un élément égal à value (en utilisant operator== ).
3) find_if recherche un élément pour lequel le prédicat p renvoie true .
5) find_if_not recherche un élément pour lequel le prédicat q renvoie false .
2,4,6) Identique à (1,3,5) , mais exécuté selon la policy .
Ces surcharges participent à la résolution de surcharge seulement si toutes les conditions suivantes sont satisfaites :

std:: is_execution_policy_v < std:: decay_t < ExecutionPolicy >> est true .

(jusqu'à C++20)

std:: is_execution_policy_v < std:: remove_cvref_t < ExecutionPolicy >> est true .

(depuis C++20)

Table des matières

Paramètres

first, last - la paire d'itérateurs définissant la plage d'éléments à examiner
value - valeur à comparer aux éléments
policy - la politique d'exécution à utiliser
p - prédicat unaire qui retourne ​ 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 de 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é , pas plus que VT sauf si pour VT un déplacement est équivalent à une copie (depuis C++11) . ​

q - prédicat unaire qui retourne ​ 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 de 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é , pas plus que VT sauf si pour VT un déplacement est équivalent à une copie (depuis C++11) . ​

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 l' intervalle [ first , last ) satisfaisant la condition suivante ou last s'il n'existe pas un tel itérateur :

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

Complexité

Étant donné N comme std:: distance ( first, last ) :

1,2) Au maximum N comparaisons avec value en utilisant operator== .
3,4) Au plus N applications du prédicat p .
5,6) Au plus N applications du prédicat q .

Exceptions

Les surcharges avec un paramètre de modèle nommé ExecutionPolicy signalent les erreurs comme suit :

  • Si l'exécution d'une fonction invoquée dans le cadre de l'algorithme lève une exception et que ExecutionPolicy fait partie des politiques standard , std::terminate est appelé. Pour tout autre ExecutionPolicy , le comportement est défini par l'implémentation.
  • Si l'algorithme ne parvient pas à allouer de la mémoire, std::bad_alloc est levé.

Implémentation possible

find (1)
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 (3)
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 (5)
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;
}
**Note:** Le contenu dans les balises ` `, `
` et `` a été préservé tel quel, conformément aux instructions. Les termes spécifiques au C++ et le code n'ont pas été traduits.

Notes

Si C++11 n'est pas disponible, un équivalent à std::find_if_not consiste à 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 Norme Fonctionnalité
__cpp_lib_algorithm_default_value_type 202403 (C++26) Initialisation par liste pour les algorithmes ( 1,2 )

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 modifiant le comportement suivants 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 devait être EqualityComparable , mais
le type de valeur de InputIt pourrait ne pas être T
a supprimé l'exigence

Voir aussi

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