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 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 [first, last) la première paire d'éléments adjacents satisfaisant la condition spécifiée.
operator==.p.policy.true:
|
|
(jusqu'à C++20) |
|
|
(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 :
Bien que la signature n'ait pas besoin d'avoir |
| 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:
bool(*iter == *std::next(iter))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):
operator==.p.operator==.p.Exceptions
- 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
(C++20) |
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) | |
(C++20) |