Namespaces
Variants

std::ranges::find_first_of

De fr.cppreference.net
 
 
Bibliothèque d'algorithmes
Algorithmes contraints et algorithmes sur les ranges (C++20)
Algorithmes contraints, p.ex. ranges::copy, ranges::sort, ...
Opérations de séquence non modificatrices    
Opérations par lots
(C++17)
Opérations de recherche
Opérations de séquence modificatrices
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 associées
Opérations de partitionnement
(C++11)    

Opérations de tri
Opérations de recherche binaire
(sur des ranges partitionnés)
Opérations d'ensemble (sur des ranges triés)
Opérations de fusion (sur des ranges triés)
Opérations de tas
Opérations minimum/maximum
(C++11)
(C++17)
Opérations de comparaison lexicographique
Opérations de permutation


 
Algorithmes contraints
Tous les noms de ce menu appartiennent à l'espace de noms std::ranges
Opérations de séquence non modificatrices
Opérations de séquence modificatrices
Opérations de partitionnement
Opérations de tri
Opérations de recherche binaire (sur des ranges triés)
       
       
Opérations d'ensemble (sur des ranges triés)
Opérations de tas
Opérations minimum/maximum
       
       
Opérations de permutation
Opérations de pliage
Opérations sur le stockage non initialisé
Types de retour
 
Défini dans l'en-tête <algorithm>
Signature d'appel
template< std::input_iterator I1, std::sentinel_for<I1> S1,
          std::forward_iterator I2, std::sentinel_for<I2> S2,
          class Pred = ranges::equal_to,
          class Proj1 = std::identity, class Proj2 = std::identity >
    requires std::indirectly_comparable<I1, I2, Pred, Proj1, Proj2>
constexpr I1
    find_first_of( I1 first1, S1 last1, I2 first2, S2 last2, Pred pred = {},
                   Proj1 proj1 = {}, Proj2 proj2 = {} );
(1) (depuis C++20)
template< ranges::input_range R1, ranges::forward_range R2,
          class Pred = ranges::equal_to,
          class Proj1 = std::identity, class Proj2 = std::identity >
    requires std::indirectly_comparable<ranges::iterator_t<R1>,
                                        ranges::iterator_t<R2>,
                                        Pred, Proj1, Proj2>
constexpr ranges::borrowed_iterator_t<R1>
    find_first_of( R1&& r1, R2&& r2, Pred pred = {},
                   Proj1 proj1 = {}, Proj2 proj2 = {} );
(2) (depuis C++20)
template< /*execution-policy*/ Ep,
          std::random_access_iterator I1, std::sized_sentinel_for<I1> S1,
          std::random_access_iterator I2, std::sized_sentinel_for<I2> S2,
          class Pred = ranges::equal_to,
          class Proj1 = std::identity, class Proj2 = std::identity >
    requires std::indirectly_comparable<I1, I2, Pred, Proj1, Proj2>
I1 find_first_of( Ep&& policy, I1 first1, S1 last1, I2 first2, S2 last2,
                  Pred pred = {}, Proj1 proj1 = {}, Proj2 proj2 = {} );
(3) (depuis C++26)
template< /*execution-policy*/ Ep,
          /*sized-random-access-range*/ R1,
          /*sized-random-access-range*/ R2,
          class Pred = ranges::equal_to,
          class Proj1 = std::identity, class Proj2 = std::identity >
    requires std::indirectly_comparable<ranges::iterator_t<R1>,
                                        ranges::iterator_t<R2>,
                                        Pred, Proj1, Proj2>
ranges::borrowed_iterator_t<R1>
    find_first_of( Ep&& policy, R1&& r1, R2&& r2, Pred pred = {},
                   Proj1 proj1 = {}, Proj2 proj2 = {} );
(4) (depuis C++26)

Pour la définition de /*execution-policy*/, voir cette page; pour la définition de /*sized-random-access-range*/, voir cette page.

Recherche dans le range source l'un des éléments du range cible. Les éléments (projetés par proj1 et proj2 respectivement) sont comparés à l'aide du prédicat binaire pred.

1) Le range source est [first1last1), et le range cible est [first2last2).
2) Le range source est r1, et le range cible est r2.
3,4) Identique à (1,2), mais exécuté selon policy.

Les entités de type fonction décrites sur cette page sont des objets fonction d'algorithme (officieusement appelés niebloids), c'est-à-dire :

Paramètres

first1, last1 - la paire itérateur-sentinelle définissant la plage
first2, last2 - la paire itérateur-sentinelle définissant la plage
r1 - la plage source
r2 - la plage cible
pred - le prédicat à appliquer aux éléments (projetés)
proj1 - la projection à appliquer aux éléments de la plage source
proj2 - la projection à appliquer aux éléments de la plage cible
policy - la politique d'exécution à utiliser

Valeur de retour

Itérateur vers le premier élément de la plage source qui correspond à un élément de la plage cible.

Si la plage cible est vide ou si aucun élément correspondant n'est trouvé, retourne :

1,3) last1
2,4) ranges::next(ranges::begin(r1), ranges::end(r1))

Complexité

Soient N1 comme ranges::distance(first1, last1) ou ranges::distance(r1), et N2 comme ranges::distance(first2, last2) ou ranges::distance(r2):

1,2) Au plus N1⋅N2 applications de pred et proj.
3,4) 𝓞(N1⋅N2) applications de pred et proj.

Exceptions

3,4) 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 interceptée est levée lors de l'accès aux 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ée).

Implémentation possible

struct find_first_of_fn
{
    template<std::input_iterator I1, std::sentinel_for<I1> S1,
             std::forward_iterator I2, std::sentinel_for<I2> S2,
             class Pred = ranges::equal_to,
             class Proj1 = std::identity, class Proj2 = std::identity>
        requires std::indirectly_comparable<I1, I2, Pred, Proj1, Proj2>
    constexpr I1 operator()(I1 first1, S1 last1, I2 first2, S2 last2, Pred pred = {},
                            Proj1 proj1 = {}, Proj2 proj2 = {}) const
    {
        for (; first1 != last1; ++first1)
            for (auto i = first2; i != last2; ++i)
                if (std::invoke(pred, std::invoke(proj1, *first1), std::invoke(proj2, *i)))
                    return first1;
        return first1;
    }
    
    template<ranges::input_range R1, ranges::forward_range R2,
             class Pred = ranges::equal_to,
             class Proj1 = std::identity, class Proj2 = std::identity>
    requires std::indirectly_comparable<ranges::iterator_t<R1>,
                                        ranges::iterator_t<R2>,
                                        Pred, Proj1, Proj2>
    constexpr ranges::borrowed_iterator_t<R1>
        operator()(R1&& r1, R2&& r2, Pred pred = {},
                   Proj1 proj1 = {}, Proj2 proj2 = {}) const
    {
        return (*this)(ranges::begin(r1), ranges::end(r1),
                       ranges::begin(r2),
                       ranges::next(ranges::begin(r2), ranges::end(r2)),
                       std::move(pred), std::move(proj1), std::move(proj2));
    }
    
    template<ranges::forward_range R1, ranges::forward_range R2,
             class Pred = ranges::equal_to,
             class Proj1 = std::identity, class Proj2 = std::identity>
    requires std::indirectly_comparable<ranges::iterator_t<R1>,
                                        ranges::iterator_t<R2>,
                                        Pred, Proj1, Proj2>
    constexpr ranges::borrowed_iterator_t<R1>
        operator()(R1&& r1, R2&& r2, Pred pred = {},
                   Proj1 proj1 = {}, Proj2 proj2 = {}) const
    {
        return (*this)(ranges::begin(r1),
                       ranges::next(ranges::begin(r1), ranges::end(r1)),
                       ranges::begin(r2),
                       ranges::next(ranges::begin(r2), ranges::end(r2)),
                       std::move(pred), std::move(proj1), std::move(proj2));
    }
};

inline constexpr find_first_of_fn find_first_of{};

Exemple

#include <algorithm>
#include <iostream>
#include <iterator>

int main()
{
    using std::ranges::find_first_of;
    
    constexpr static auto haystack = {1, 2, 3, 4};
    constexpr static auto needles  = {0, 3, 4, 3};
    
    constexpr auto found1 = find_first_of(haystack.begin(), haystack.end(),
                                          needles.begin(), needles.end());
    static_assert(std::distance(haystack.begin(), found1) == 2);
    
    constexpr auto found2 = find_first_of(haystack, needles);
    static_assert(std::distance(haystack.begin(), found2) == 2);
    
    constexpr static auto negatives = {-6, -3, -4, -3};
    constexpr auto not_found = find_first_of(haystack, negatives);
    static_assert(not_found == haystack.end());
    
    constexpr auto found3 = find_first_of(haystack, negatives,
        [](int x, int y) { return x == -y; }); // uses a binary comparator
    static_assert(std::distance(haystack.begin(), found3) == 2);
    
    struct P { int x, y; };
    constexpr static auto p1 = {P{1, -1}, P{2, -2}, P{3, -3}, P{4, -4}};
    constexpr static auto p2 = {P{5, -5}, P{6, -3}, P{7, -5}, P{8, -3}};
    
    // Compare only P::y data members by projecting them:
    const auto found4 = find_first_of(p1, p2, {}, &P::y, &P::y);
    std::cout << "First equivalent element {" << found4->x << ", " << found4->y
              << "} was found at position " << std::distance(p1.begin(), found4)
              << ".\n";
}

Sortie :\n

First equivalent element {3, -3} was found at position 2.

Voir aussi

recherche l'un quelconque d'un ensemble d'éléments
(modèle de fonction)
trouve les deux premiers éléments adjacents égaux (ou satisfaisant un prédicat donné)
(objet fonction algorithme)
trouve le premier élément satisfaisant des critères spécifiques
(objet fonction algorithme)
trouve la dernière séquence d'éléments dans une certaine plage
(objet fonction algorithme)
recherche la première occurrence d'une plage d'éléments
(objet fonction algorithme)
recherche la première occurrence d'un nombre de copies consécutives d'un élément dans une plage
(objet fonction algorithme)