std:: adjacent_find
|
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
ExecutionPolicy,
class
ForwardIt
>
ForwardIt adjacent_find
(
ExecutionPolicy
&&
policy,
|
(2) | (depuis C++17) |
|
template
<
class
ForwardIt,
class
BinaryPred
>
ForwardIt adjacent_find
(
ForwardIt first, ForwardIt last,
|
(3) | (constexpr depuis C++20) |
|
template
<
class
ExecutionPolicy,
class
ForwardIt,
class
BinaryPred
>
ForwardIt adjacent_find
(
ExecutionPolicy
&&
policy,
|
(4) | (depuis C++17) |
Recherche dans la plage
[
first
,
last
)
deux éléments consécutifs égaux.
|
std:: is_execution_policy_v < std:: decay_t < ExecutionPolicy >> est true . |
(jusqu'en 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 l'intervalle des éléments à examiner |
| policy | - | la politique d'exécution à utiliser |
| p | - |
prédicat binaire qui renvoie
true
si les éléments doivent être traités comme égaux.
La signature de la fonction de prédicat doit être équivalente à ce qui suit : 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 pouvoir accepter toutes les valeurs de type (éventuellement const)
|
| Exigences de type | ||
-
ForwardIt
doit satisfaire aux exigences de
LegacyForwardIterator
.
|
||
-
BinaryPred
doit satisfaire aux exigences de
BinaryPredicate
.
|
||
Valeur de retour
Un itérateur vers le premier de la première paire d'éléments identiques, c'est-à-dire le premier itérateur it tel que * it == * ( it + 1 ) pour (1,2) ou p ( * it, * ( it + 1 ) ) ! = false pour (3,4) .
Si aucun élément de ce type n'est trouvé, last est retourné.
Complexité
Soit
result
la valeur de retour de
adjacent_find
,
M
comme
std::
distance
(
first, result
)
et
N
comme
std::
distance
(
first, last
)
:
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
ExecutionPolicyfait partie des politiques standard , std::terminate est appelé. Pour tout autreExecutionPolicy, 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
| 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 (3) |
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 << "Aucun élément adjacent correspondant\n"; else std::cout << "La première paire adjacente d'éléments égaux se trouve à " << 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 << "Le vecteur entier est trié en ordre croissant\n"; else std::cout << "Le dernier élément de la sous-séquence non décroissante se trouve à " << std::distance(v1.begin(), i2) << ", *i2 = " << *i2 << '\n'; }
Sortie :
La première paire adjacente d'éléments égaux se trouve à 4, *i1 = 40 Le dernier élément de la sous-séquence non décroissante se trouve à 7, *i2 = 41
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 240 | C++98 |
le prédicat était appliqué
std::
find
( first, last, value ) - first fois pour (1,3) , où value n'était jamais défini |
appliqué
std::
min
(
( result - first ) + 1 , ( last - first ) - 1 ) fois |
Voir aussi
|
supprime les éléments dupliqués consécutifs dans une plage
(modèle de fonction) |
|
|
(C++20)
|
trouve les deux premiers éléments adjacents qui sont égaux (ou satisfont un prédicat donné)
(objet fonction algorithme) |