Namespaces
Variants

std::adjacent_find

Depuis fr.cppreference.net
 
 
Bibliothèque d'algorithmes
Algorithmes contraints et algorithmes sur les vues (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 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 sur les tas
Opérations de 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 ForwardIt >
ForwardIt adjacent_find( ForwardIt first, ForwardIt last );
(1) (constexpr depuis C++20)
template< class ForwardIt, class BinaryPred >
ForwardIt adjacent_find( ForwardIt first, ForwardIt last,
                         BinaryPred p );
(2) (constexpr depuis C++20)
template< class ExecutionPolicy, class ForwardIt >
ForwardIt adjacent_find( ExecutionPolicy&& policy,
                         ForwardIt first, ForwardIt last );
(3) (depuis C++17)
template< class ExecutionPolicy, class ForwardIt, class BinaryPred >
ForwardIt adjacent_find( ExecutionPolicy&& policy,
                         ForwardIt first, ForwardIt last,
                         BinaryPred p );
(4) (depuis C++17)

Recherche dans la plage source [firstlast) la première paire d'éléments adjacents satisfaisant la condition spécifiée.

1) Recherche la première paire d'éléments adjacents égaux. L'égalité est déterminée par operator==.
2) Recherche la première paire d'éléments adjacents satisfaisant le prédicat binaire donné p.
3,4) Identique à (1,2), mais exécuté conformément à policy.
Ces surcharges ne participent à la résolution de surcharge que 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
p - prédicat binaire qui renvoie true si les éléments doivent être traités comme égaux.

La signature du prédicat doit être équivalente à la suivante :

bool pred(const Type1 &a, const Type2 &b);

Bien que la signature n'ait pas besoin d'avoir const &, la fonction ne doit pas modifier les objets qui lui sont passés et doit accepter toutes les valeurs de type (éventuellement const) Type1 et Type2 quelle que soit la catégorie de valeur (ainsi, Type1 & n'est pas autorisé, pas plus que Type1 sauf si Type1 un déplacement est équivalent à une copie(depuis C++11)).
Les types Type1 et Type2 doivent être tels qu'un objet de type ForwardIt puisse être déréférencé puis converti implicitement en chacun d'eux. ​

policy - la politique d'exécution à utiliser
Exigences de type
-
ForwardIt doit satisfaire les exigences de LegacyForwardIterator.
-
BinaryPred doit satisfaire les exigences de BinaryPredicate.

Valeur de retour

Le premier itérateur iter dans la plage source tel que l'expression suivante s'évalue à true:

1,3) bool(*iter == *std::next(iter))
2,4) bool(p(*iter, std::next(iter))

Si aucun itérateur de ce type n'est trouvé, last est renvoyé.

Complexité

Soit result la valeur de retour de adjacent_find, M comme std::distance(first, result) et N comme std::distance(first, last):

1) Exactement min(M+1,N-1) comparaisons utilisant operator==.
2) Exactement min(M+1,N-1) applications du prédicat p.
3) 𝓞(N) comparaisons utilisant operator==.
4) 𝓞(N) applications du prédicat p.

Exceptions

3,4) Pendant l'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é).

Implémentation possible

adjacent_find (1)
template<class ForwardIt>
ForwardIt adjacent_find(ForwardIt first, ForwardIt last)
{
    if (first == last)
        return last;
    
    ForwardIt next = first;
    ++next;
    
    for (; next != last; ++next, ++first)
        if (*first == *next)
            return first;
    
    return last;
}
adjacent_find (2)
template<class ForwardIt, class BinaryPred>
ForwardIt adjacent_find(ForwardIt first, ForwardIt last, BinaryPred p)
{
    if (first == last)
        return last;
    
    ForwardIt next = first;
    ++next;
    
    for (; next != last; ++next, ++first)
        if (p(*first, *next))
            return first;
    
    return last;
}

Exemple

#include <algorithm>
#include <functional>
#include <iostream>
#include <vector>

int main()
{
    std::vector<int> v1{0, 1, 2, 3, 40, 40, 41, 41, 5};
    
    auto i1 = std::adjacent_find(v1.begin(), v1.end());
    
    if (i1 == v1.end())
        std::cout << "No matching adjacent elements\n";
    else
        std::cout << "The first adjacent pair of equal elements is at "
                  << std::distance(v1.begin(), i1) << ", *i1 = "
                  << *i1 << '\n';
    
    auto i2 = std::adjacent_find(v1.begin(), v1.end(), std::greater<int>());
    if (i2 == v1.end())
        std::cout << "The entire vector is sorted in ascending order\n";
    else
        std::cout << "The last element in the non-decreasing subsequence is at "
                  << std::distance(v1.begin(), i2) << ", *i2 = " << *i2 << '\n';
}

Sortie :

The first adjacent pair of equal elements is at 4, *i1 = 40
The last element in the non-decreasing subsequence is at 7, *i2 = 41

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 publié Comportement correct
LWG 240 C++98 l'exigence de complexité était peu claire rendue claire

Voir aussi

trouve les deux premiers éléments adjacents qui sont égaux (ou satisfont un prédicat donné)
(objet fonction d'algorithme)
supprime les éléments dupliqués consécutifs dans une plage
(patron de fonction & objet fonction d'algorithme)