Namespaces
Variants

std::is_partitioned

Depuis 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)

Opérations de tri et 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 sur 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 InputIt, class UnaryPred >
bool is_partitioned( InputIt first, InputIt last, UnaryPred p );
(1) (depuis C++11)
(constexpr depuis C++20)
template< class ExecutionPolicy, class ForwardIt, class UnaryPred >
bool is_partitioned( ExecutionPolicy&& policy,
                     ForwardIt first, ForwardIt last, UnaryPred p );
(2) (depuis C++17)
1) Vérifie si [firstlast) est partitionné par le prédicat p : tous les éléments satisfaisant p apparaissent avant tous ceux qui ne le satisfont pas.
2) Identique à (1), mais exécuté selon policy.
Cette surcharge participe à 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

first, last - la paire d'itérateurs définissant la plage d'éléments à examiner
policy - la politique d'exécution à utiliser
p - prédicat unaire qui renvoie true pour les éléments censés se trouver au début de la plage.

L'expression p(v) doit être convertible en bool pour chaque argument v de type (éventuellement const) VT, où VT est le type valeur de InputIt, indépendamment de la catégorie de valeur, et ne doit pas modifier v. Ainsi, un type de paramètre de VT&n'est pas autorisé, pas plus que VT sauf si pour VT un déplacement équivaut à une copie(depuis C++11). ​

Exigences de type
-
InputIt doit satisfaire les exigences de LegacyInputIterator.
-
ForwardIt doit satisfaire les exigences de LegacyForwardIterator. et son type valeur doit être convertible en le type de paramètre de UnaryPred.
-
UnaryPred doit satisfaire les exigences de Predicate.

Valeur de retour

truetrue si les éléments e de [firstlast) sont partitionnés par rapport à l'expression p(e). falsefalse sinon.

Complexité

Au plus std::distance(first, last) applications de p.

Exceptions

La surcharge avec un paramètre template nommé ExecutionPolicy signale 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 ExecutionPolicy fait partie des politiques standard, std::terminate est appelé. Pour toute autre ExecutionPolicy, 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

template<class InputIt, class UnaryPred>
bool is_partitioned(InputIt first, InputIt last, UnaryPred p)
{
    for (; first != last; ++first)
        if (!p(*first))
            break;
    for (; first != last; ++first)
        if (p(*first))
            return false;
    return true;
}

Exemple

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

int main()
{
    std::array<int, 9> v {1, 2, 3, 4, 5, 6, 7, 8, 9};
    
    auto is_even = [](int i) { return i % 2 == 0; };
    std::cout.setf(std::ios_base::boolalpha);
    std::cout << std::is_partitioned(v.begin(), v.end(), is_even) << ' ';
    
    std::partition(v.begin(), v.end(), is_even);
    std::cout << std::is_partitioned(v.begin(), v.end(), is_even) << ' ';
    
    std::reverse(v.begin(), v.end());
    std::cout << std::is_partitioned(v.cbegin(), v.cend(), is_even) << ' ';
    std::cout << std::is_partitioned(v.crbegin(), v.crend(), is_even) << '\n';
}

Sortie :

false true false true

Voir aussi

divise une plage d'éléments en deux groupes
(modèle de fonction & objet fonction d'algorithme)
localise le point de partition d'une plage partitionnée
(modèle de fonction & objet fonction d'algorithme)
détermine si la plage est partitionnée par le prédicat donné
(objet fonction d'algorithme)