Namespaces
Variants

std::find_end

De fr.cppreference.net
 
 
Bibliothèque d'algorithmes
Algorithmes contraints et algorithmes sur plages (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 plages partitionnées)
Opérations d'ensemble (sur plages triées)
Opérations de fusion (sur plages triées)
Opérations de 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 ForwardIt1, class ForwardIt2 >
ForwardIt1 find_end( ForwardIt1 first1, ForwardIt1 last1,
                     ForwardIt2 first2, ForwardIt2 last2 );
(1) (constexpr depuis C++20)
template< class ForwardIt1, class ForwardIt2, class BinaryPred >
ForwardIt1 find_end( ForwardIt1 first1, ForwardIt1 last1,
                     ForwardIt2 first2, ForwardIt2 last2,
                     BinaryPred p );
(2) (constexpr depuis C++20)
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 >
ForwardIt1 find_end( ExecutionPolicy&& policy,
                     ForwardIt1 first1, ForwardIt1 last1,
                     ForwardIt2 first2, ForwardIt2 last2 );
(3) (depuis C++17)
template< class ExecutionPolicy,
          class ForwardIt1, class ForwardIt2, class BinaryPred >
ForwardIt1 find_end( ExecutionPolicy&& policy,
                     ForwardIt1 first1, ForwardIt1 last1,
                     ForwardIt2 first2, ForwardIt2 last2,
                     BinaryPred p );
(4) (depuis C++17)

Recherche la dernière occurrence de la plage cible [first2last2) dans la plage source [first1last1).

1) Les éléments sont comparés à l'aide de operator==.
2) Les éléments sont comparés à l'aide du prédicat binaire donné p.
3,4) Identique à (1,2), mais exécuté selon policy.
Ces surcharges participent à la résolution de surcharge uniquement 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

first1, last1 - la paire d'itérateurs définissant la plage source
first2, last2 - la paire d'itérateurs définissant la plage cible
p - prédicat binaire qui renvoie true si les éléments doivent être considérés comme égaux.

La signature de la fonction 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 pouvoir 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é, ni Type1 sauf si pour Type1 un déplacement est équivalent à une copie(depuis C++11)).
Les types Type1 et Type2 doivent être tels que les objets de types ForwardIt1 et ForwardIt2 puissent être déréférencés puis implicitement convertis respectivement en Type1 et Type2. ​

policy - la politique d'exécution à utiliser
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 plage cible dans la plage source.

Si la plage cible est vide ou qu'elle n'apparaît pas dans la plage source, last1 est renvoyé.

Complexité

Étant donné N1 comme std::distance(first1, last1) et N2 comme std::distance(first2, last2) :

1) Au plus N2⋅(N1-N2+1) comparaisons à l'aide de operator==.
2) Au plus N2⋅(N1-N2+1) applications de p.
3) 𝓞(N2⋅(N1-N2+1)) comparaisons à l'aide de operator==.
4) 𝓞(N2⋅(N1-N2+1)) applications de p.

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

find_end (1)
template<class ForwardIt1, class ForwardIt2>
constexpr //< since C++20
ForwardIt1 find_end(ForwardIt1 first1, ForwardIt1 last1,
                    ForwardIt2 first2, ForwardIt2 last2)
{
    if (first2 == last2)
        return last1;
    
    ForwardIt1 result = last1;
    while (true)
    {
        ForwardIt1 new_result = std::search(first1, last1, first2, last2);
        if (new_result == last1)
            break;
        else
        {
            result = new_result;
            first1 = result;
            ++first1;
        }
    }
    return result;
}
find_end (2)
template<class ForwardIt1, class ForwardIt2, class BinaryPred>
constexpr //< since C++20
ForwardIt1 find_end(ForwardIt1 first1, ForwardIt1 last1,
                    ForwardIt2 first2, ForwardIt2 last2, BinaryPred p)
{
    if (first2== last2)
        return last1;
    
    ForwardIt1 result = last1;
    while (true)
    {
        ForwardIt1 new_result = std::search(first1, last1, first2, first2, p);
        if (new_result == last1)
            break;
        else
        {
            result = new_result;
            first1 = result;
            ++first1;
        }
    }
    return result;
}

Exemple

#include <algorithm>
#include <array>
#include <cmath>
#include <iostream>

auto print_result = [](auto result, const auto& v)
{
    result == v.end()
        ? std::cout << "Sequence not found\n"
        : std::cout << "Last occurrence is at: " << std::distance(v.begin(), result)
                    << '\n';
};

int main()
{
    const auto v = {1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4};
    
    for (const auto& x : {std::array{1, 2, 3}, {4, 5, 6}})
    {
        auto iter = std::find_end(v.begin(), v.end(), x.begin(), x.end()); // overload (1)
        print_result(iter, v);
    }
    
    for (const auto& x : {std::array{-1, -2, -3}, {-4, -5, -6}})
    {
        auto iter = std::find_end(v.begin(), v.end(), x.begin(), x.end(), // overload (3)
                                  [](int x, int y)
                                  {
                                      return std::abs(x) == std::abs(y);
                                  });
        print_result(iter, v);
    }
}

Sortie :

Last occurrence is at: 8
Sequence not found
Last occurrence is at: 8
Sequence not found

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 tel que publié Comportement correct
LWG 1205 C++98 la valeur de retour n'était pas claire si la plage cible est vide renvoie last1 dans ce cas
LWG 2150 C++98 la condition d'« occurrence » était incorrecte corrigée

Voir aussi

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
(modèle de fonction & objet fonction algorithme)
détermine si une séquence est une sous-séquence d'une autre
(modèle de fonction & objet fonction algorithme)
trouve les deux premiers éléments adjacents égaux (ou satisfaisant un prédicat donné)
(modèle de fonction & objet fonction algorithme)
trouve le premier élément satisfaisant des critères spécifiques
(modèle de fonction & objet fonction algorithme)
recherche l'un quelconque d'un ensemble d'éléments
(modèle de fonction & objet fonction algorithme)
recherche la première occurrence d'un nombre de copies consécutives d'un élément dans une plage
(modèle de fonction & objet fonction algorithme)