Namespaces
Variants

std:: partition

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
C library
Numeric operations
Operations on uninitialized memory
Défini dans l'en-tête <algorithm>
template < class ForwardIt, class UnaryPred >
ForwardIt partition ( ForwardIt first, ForwardIt last, UnaryPred p ) ;
(1) (constexpr depuis C++20)
template < class ExecutionPolicy, class ForwardIt, class UnaryPred >

ForwardIt partition ( ExecutionPolicy && policy,

ForwardIt first, ForwardIt last, UnaryPred p ) ;
(2) (depuis C++17)
1) Réorganise les éléments dans l'intervalle [ first , last ) de telle sorte que tous les éléments pour lesquels le prédicat p renvoie true précèdent tous les éléments pour lesquels le prédicat p renvoie false . L'ordre relatif des éléments n'est pas préservé.
2) Identique à (1) , mais exécuté selon la policy .
Cette surcharge participe à la résolution de surcharge uniquement si toutes les conditions suivantes sont satisfaites :

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)

Si le type de * first n'est pas Swappable (jusqu'à C++11) ForwardIt n'est pas ValueSwappable (depuis C++11) , le comportement est indéfini.

Table des matières

Paramètres

first, last - la paire d'itérateurs définissant l'intervalle des éléments à réorganiser
policy - la politique d'exécution à utiliser
p - prédicat unaire qui retourne ​ true si l'élément doit être ordonné avant les autres éléments.

L'expression p ( v ) doit être convertible en bool pour chaque argument v de type (éventuellement const) VT , où VT est le type de valeur de ForwardIt , indépendamment de la catégorie de valeur , et ne doit pas modifier v . Ainsi, un type de paramètre 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
-
ForwardIt doit satisfaire aux exigences de LegacyForwardIterator .
-
UnaryPred doit satisfaire aux exigences de Predicate .

Valeur de retour

Itérateur vers le premier élément du deuxième groupe.

Complexité

Étant donné N comme std:: distance ( first, last ) :

1) Exactement N applications de p .
Au maximum N/2 échanges si ForwardIt satisfait aux exigences de LegacyBidirectionalIterator , et au maximum N échanges sinon.
2) O(N) applications de p .
O(N·log(N)) échanges.

Exceptions

La surcharge avec un paramètre de modèle 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 tout 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

Implémente la surcharge (1) en préservant la compatibilité C++11.

template<class ForwardIt, class UnaryPred>
ForwardIt partition(ForwardIt first, ForwardIt last, UnaryPred p)
{
    first = std::find_if_not(first, last, p);
    if (first == last)
        return first;
    for (auto i = std::next(first); i != last; ++i)
        if (p(*i))
        {
            std::iter_swap(i, first);
            ++first;
        }
    return first;
}

Exemple

#include <algorithm>
#include <forward_list>
#include <iostream>
#include <iterator>
#include <vector>
template<class ForwardIt>
void quicksort(ForwardIt first, ForwardIt last)
{
    if (first == last)
        return;
    auto pivot = *std::next(first, std::distance(first, last) / 2);
    auto middle1 = std::partition(first, last, [pivot](const auto& em)
    {
        return em < pivot;
    });
    auto middle2 = std::partition(middle1, last, [pivot](const auto& em)
    {
        return !(pivot < em);
    });
    quicksort(first, middle1);
    quicksort(middle2, last);
}
int main()
{
    std::vector<int> v{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    std::cout << "Original vector: ";
    for (int elem : v)
        std::cout << elem << ' ';
    auto it = std::partition(v.begin(), v.end(), [](int i) {return i % 2 == 0;});
    std::cout << "\nPartitioned vector: ";
    std::copy(std::begin(v), it, std::ostream_iterator<int>(std::cout, " "));
    std::cout << "* ";
    std::copy(it, std::end(v), std::ostream_iterator<int>(std::cout, " "));
    std::forward_list<int> fl {1, 30, -4, 3, 5, -4, 1, 6, -8, 2, -5, 64, 1, 92};
    std::cout << "\nUnsorted list: ";
    for (int n : fl)
        std::cout << n << ' ';
    quicksort(std::begin(fl), std::end(fl));
    std::cout << "\nSorted using quicksort: ";
    for (int fi : fl)
        std::cout << fi << ' ';
    std::cout << '\n';
}

Sortie possible :

Original vector: 0 1 2 3 4 5 6 7 8 9 
Partitioned vector: 0 8 2 6 4 * 5 3 7 1 9 
Unsorted list: 1 30 -4 3 5 -4 1 6 -8 2 -5 64 1 92 
Sorted using quicksort: -8 -5 -4 -4 1 1 1 2 3 5 6 30 64 92

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 498 C++98 std::partition exigeait que first et
last soient des LegacyBidirectionalIterator
seulement requis d'être des
LegacyForwardIterator
LWG 2150 C++98 std::partition devait seulement placer un élément
satisfaisant p avant un élément ne satisfaisant pas p
a corrigé la
spécification

Voir aussi

détermine si la plage est partitionnée par le prédicat donné
(modèle de fonction)
divise les éléments en deux groupes en préservant leur ordre relatif
(modèle de fonction)
divise une plage d'éléments en deux groupes
(objet fonction algorithme)