Namespaces
Variants

std:: is_permutation

From cppreference.net
Algorithm library
Constrained algorithms and algorithms on ranges (C++20)
Constrained algorithms, e.g. ranges::copy , ranges::sort , ...
Execution policies (C++17)
Non-modifying sequence operations
Batch operations
(C++17)
Search operations
Modifying sequence operations
Copy operations
(C++11)
(C++11)
Swap operations
Transformation operations
Generation operations
Removing operations
Order-changing operations
(until C++17) (C++11)
(C++20) (C++20)
Sampling operations
(C++17)

Sorting and related operations
Partitioning operations
Sorting operations
Binary search operations
(on partitioned ranges)
Set operations (on sorted ranges)
Merge operations (on sorted ranges)
Heap operations
Minimum/maximum operations
Lexicographical comparison operations
Permutation operations
is_permutation
(C++11)


C library
Numeric operations
Operations on uninitialized memory
Défini dans l'en-tête <algorithm>
template < class ForwardIt1, class ForwardIt2 >

bool is_permutation ( ForwardIt1 first1, ForwardIt1 last1,

ForwardIt2 first2 ) ;
(1) (depuis C++11)
(constexpr depuis C++20)
template < class ForwardIt1, class ForwardIt2,

class BinaryPredicate >
bool is_permutation ( ForwardIt1 first1, ForwardIt1 last1,

ForwardIt2 first2, BinaryPredicate p ) ;
(2) (depuis C++11)
(constexpr depuis C++20)
template < class ForwardIt1, class ForwardIt2 >

bool is_permutation ( ForwardIt1 first1, ForwardIt1 last1,

ForwardIt2 first2, ForwardIt2 last2 ) ;
(3) (depuis C++14)
(constexpr depuis C++20)
template < class ForwardIt1, class ForwardIt2,

class BinaryPredicate >
bool is_permutation ( ForwardIt1 first1, ForwardIt1 last1,
ForwardIt2 first2, ForwardIt2 last2,

BinaryPredicate p ) ;
(4) (depuis C++14)
(constexpr depuis C++20)

Vérifie si [ first1 , last1 ) est une permutation d'une plage commençant à first2 :

  • Pour les surcharges (1,2) , la deuxième plage possède std:: distance ( first1, last1 ) éléments.
  • Pour les surcharges (3,4) , la deuxième plage est [ first2 , last2 ) .
1,3) Les éléments sont comparés en utilisant operator == .
2,4) Les éléments sont comparés en utilisant le prédicat binaire donné p .

Si ForwardIt1 et ForwardIt2 ont des types de valeur différents, le programme est mal formé.

Si la fonction de comparaison n'est pas une relation d'équivalence , le comportement est indéfini.

Table des matières

Paramètres

first1, last1 - la paire d'itérateurs définissant le premier intervalle d'éléments à comparer
first2, last2 - la paire d'itérateurs définissant le deuxième intervalle d'éléments à comparer
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 du type (éventuellement const) Type1 et Type2 indépendamment de la catégorie de valeur (ainsi, Type1 & n'est pas autorisé , pas plus que Type1 sauf si pour Type1 un déplacement équivaut à une copie (depuis C++11) ).
Les types Type1 et Type2 doivent être tels que les objets des types InputIt1 et InputIt2 puissent être déréférencés puis implicitement convertis en Type1 et Type2 respectivement. ​

Exigences de type
-
ForwardIt1, ForwardIt2 doivent satisfaire aux exigences de LegacyForwardIterator .

Valeur de retour

true si la plage [ first1 , last1 ) est une permutation de la plage [ first2 , last2 ) , false sinon.

Complexité

Étant donné N comme std:: distance ( first1, last1 ) :

1) Exactement N comparaisons en utilisant operator == si les deux plages sont égales, sinon O(N 2
)
comparaisons dans le pire cas.
2) Exactement N applications du prédicat p si les deux plages sont égales, sinon O(N 2
)
applications dans le pire cas.
3,4) Si ForwardIt1 et ForwardIt2 sont tous deux des LegacyRandomAccessIterator , et que last1 - first1 ! = last2 - first2 est true , aucune comparaison ne sera effectuée.
Sinon :
3) Exactement N comparaisons en utilisant operator == si les deux plages sont égales, sinon O(N 2
)
comparaisons dans le pire cas.
4) Exactement N applications du prédicat p si les deux plages sont égales, sinon O(N 2
)
applications dans le pire cas.

Implémentation possible

template<class ForwardIt1, class ForwardIt2>
bool is_permutation(ForwardIt1 first, ForwardIt1 last,
                    ForwardIt2 d_first)
{
    // ignorer le préfixe commun
    std::tie(first, d_first) = std::mismatch(first, last, d_first);
    // itérer sur le reste, en comptant combien de fois chaque élément
    // de [first, last) apparaît dans [d_first, d_last)
    if (first != last)
    {
        ForwardIt2 d_last = std::next(d_first, std::distance(first, last));
        for (ForwardIt1 i = first; i != last; ++i)
        {
            if (i != std::find(first, i, *i))
                continue; // ce *i a déjà été vérifié
            auto m = std::count(d_first, d_last, *i);
            if (m == 0 || std::count(i, last, *i) != m)
                return false;
        }
    }
    return true;
}

Note

La std::is_permutation peut être utilisée dans des tests , notamment pour vérifier la correction des algorithmes de réarrangement (par exemple le tri, le mélange, la partition). Si x est une plage originale et y est une plage permutée alors std :: is_permutation ( x, y ) == true signifie que y est constituée des "mêmes" éléments, se trouvant peut-être à d'autres positions.

Exemple

#include <algorithm>
#include <iostream>
template<typename Os, typename V>
Os& operator<<(Os& os, const V& v)
{
    os << "{ ";
    for (const auto& e : v)
        os << e << ' ';
    return os << '}';
}
int main()
{
    static constexpr auto v1 = {1, 2, 3, 4, 5};
    static constexpr auto v2 = {3, 5, 4, 1, 2};
    static constexpr auto v3 = {3, 5, 4, 1, 1};
    std::cout << v2 << " est une permutation de " << v1 << " : " << std::boolalpha
              << std::is_permutation(v1.begin(), v1.end(), v2.begin()) << '\n'
              << v3 << " est une permutation de " << v1 << " : "
              << std::is_permutation(v1.begin(), v1.end(), v3.begin()) << '\n';
}

Sortie :

{ 3 5 4 1 2 } est une permutation de { 1 2 3 4 5 }: true
{ 3 5 4 1 1 } est une permutation de { 1 2 3 4 5 }: false

Voir aussi

génère la prochaine permutation lexicographique supérieure d'une plage d'éléments
(modèle de fonction)
génère la prochaine permutation lexicographique inférieure d'une plage d'éléments
(modèle de fonction)
spécifie qu'une relation impose une relation d'équivalence
(concept)
détermine si une séquence est une permutation d'une autre séquence
(objet fonction algorithme)