std:: find_end
|
Défini dans l'en-tête
<algorithm>
|
||
|
template
<
class
ForwardIt1,
class
ForwardIt2
>
ForwardIt1 find_end
(
ForwardIt1 first, ForwardIt1 last,
|
(1) | (constexpr depuis C++20) |
|
template
<
class
ExecutionPolicy,
class
ForwardIt1,
class
ForwardIt2
>
ForwardIt1 find_end
(
ExecutionPolicy
&&
policy,
|
(2) | (depuis C++17) |
|
template
<
class
ForwardIt1,
class
ForwardIt2,
class
BinaryPred
>
ForwardIt1 find_end
(
ForwardIt1 first, ForwardIt1 last,
|
(3) | (constexpr depuis C++20) |
|
template
<
class
ExecutionPolicy,
class
ForwardIt1,
class
ForwardIt2,
class
BinaryPred
>
|
(4) | (depuis C++17) |
Recherche la dernière occurrence de la séquence
[
s_first
,
s_last
)
dans la plage
[
first
,
last
)
.
|
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 l' intervalle des éléments à examiner |
| s_first, s_last | - | la paire d'itérateurs définissant l' intervalle des éléments à rechercher |
| 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 | ||
-
ForwardIt1
doit satisfaire aux exigences de
LegacyForwardIterator
.
|
||
-
ForwardIt2
doit satisfaire aux exigences de
LegacyForwardIterator
.
|
||
Valeur de retour
Itérateur vers le début de la dernière occurrence de la séquence
[
s_first
,
s_last
)
dans la plage
[
first
,
last
)
.
Si
[
s_first
,
s_last
)
est vide ou si aucune telle séquence n'est trouvée,
last
est retourné.
Complexité
Soit N défini comme std:: distance ( first, last ) et S défini comme std:: distance ( s_first, s_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
| find_end (1) |
|---|
template<class ForwardIt1, class ForwardIt2> constexpr //< depuis C++20 ForwardIt1 find_end(ForwardIt1 first, ForwardIt1 last, ForwardIt2 s_first, ForwardIt2 s_last) { if (s_first == s_last) return last; ForwardIt1 result = last; while (true) { ForwardIt1 new_result = std::search(first, last, s_first, s_last); if (new_result == last) break; else { result = new_result; first = result; ++first; } } return result; } |
| find_end (3) |
template<class ForwardIt1, class ForwardIt2, class BinaryPred> constexpr //< depuis C++20 ForwardIt1 find_end(ForwardIt1 first, ForwardIt1 last, ForwardIt2 s_first, ForwardIt2 s_last, BinaryPred p) { if (s_first == s_last) return last; ForwardIt1 result = last; while (true) { ForwardIt1 new_result = std::search(first, last, s_first, s_last, p); if (new_result == last) break; else { result = new_result; first = result; ++first; } } return result; } |
Exemple
#include <algorithm> #include <array> #include <cmath> #include <iostream> auto print_result = [](auto result, const auto& v) { result == v.end() ? std::cout << "Séquence non trouvée\n" : std::cout << "Dernière occurrence à : " << std::distance(v.begin(), result) << '\n'; }; int main() { const auto v = {1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4}; for (auto const& x : {std::array{1, 2, 3}, {4, 5, 6}}) { auto iter = std::find_end(v.begin(), v.end(), x.begin(), x.end()); // surcharge (1) print_result(iter, v); } for (auto const& x : {std::array{-1, -2, -3}, {-4, -5, -6}}) { auto iter = std::find_end(v.begin(), v.end(), x.begin(), x.end(), // surcharge (3) [](int x, int y) { return std::abs(x) == std::abs(y); }); print_result(iter, v); } }
Sortie :
Dernière occurrence à : 8 Séquence non trouvée Dernière occurrence à : 8 Séquence non trouvée
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 | Applicable à | Comportement publié | Comportement corrigé |
|---|---|---|---|
| LWG 1205 | C++98 |
la valeur de retour était ambiguë si
[
s_first
,
s_last
)
est vide
|
retourne last dans ce cas |
| LWG 2150 | C++98 | la condition d'"occurrence de séquence" était incorrecte | corrigée |
Voir aussi
|
recherche la première occurrence d'une plage d'éléments
(modèle de fonction) |
|
|
renvoie
true
si une séquence est une sous-séquence d'une autre
(modèle de fonction) |
|
|
trouve les deux premiers éléments adjacents qui sont égaux (ou satisfont un prédicat donné)
(modèle de fonction) |
|
|
(C++11)
|
trouve le premier élément satisfaisant des critères spécifiques
(modèle de fonction) |
|
recherche l'un quelconque d'un ensemble d'éléments
(modèle de fonction) |
|
|
recherche la première occurrence d'un nombre de copies consécutives d'un élément dans une plage
(modèle de fonction) |
|
|
(C++20)
|
trouve la dernière séquence d'éléments dans une certaine plage
(objet fonction algorithme) |