Namespaces
Variants

std::stable_partition

De fr.cppreference.net
 
 
Bibliothèque d'algorithmes
Algorithmes contraints et algorithmes sur plages (C++20)
Algorithmes contraints, par 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 associées
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 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 BidirIt, class UnaryPred >
BidirIt stable_partition( BidirIt first, BidirIt last, UnaryPred p );
(1) (constexpr depuis C++26)
template< class ExecutionPolicy, class BidirIt, class UnaryPred >
BidirIt stable_partition( ExecutionPolicy&& policy,
                          BidirIt first, BidirIt last, UnaryPred p );
(2) (depuis C++17)
1) Réordonne les éléments dans la plage [firstlast) de telle sorte que tous les éléments pour lesquels le prédicat p retourne true précèdent les éléments pour lesquels le prédicat p retourne false. L'ordre relatif des éléments est préservé.
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)

Si l'une des conditions suivantes est satisfaite, le comportement est indéfini :

(jusqu'à C++11)
(depuis C++11)

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 renvoie ​ 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 BidirIt , 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
-
BidirIt doit satisfaire aux exigences de LegacyBidirectionalIterator .
-
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 .
O(N) échanges s'il y a suffisamment de mémoire supplémentaire, sinon au plus N⋅log 2 (N) échanges.
2) O(N) applications de p .
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é.

Notes

Cette fonction tente d'allouer un tampon temporaire. Si l'allocation échoue, l'algorithme moins efficace est choisi.

Les implémentations dans libc++ et libstdc++ acceptent également les plages dénotées par des LegacyForwardIterator s comme extension.

Macro de test de fonctionnalité Valeur Std Fonctionnalité
__cpp_lib_constexpr_algorithms 202306L (C++26) constexpr tri stable ( 1 )

Exemple

#include <algorithm>
#include <iostream>
#include <vector>
int main()
{
    std::vector<int> v{0, 0, 3, -1, 2, 4, 5, 0, 7};
    std::stable_partition(v.begin(), v.end(), [](int n) { return n > 0; });
    for (int n : v)
        std::cout << n << ' ';
    std::cout << '\n';
}

Sortie :

3 2 4 5 7 0 0 -1 0

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 Appliqué à Comportement tel que publié Comportement correct
LWG 2150 C++98 std::stable_partition n'était requis que pour placer un
élément satisfaisant p avant un élément ne satisfaisant pas p
corrigé l'exigence
requise

Voir aussi

divise une plage d'éléments en deux groupes
(modèle de fonction & objet fonction d'algorithme)
divise les éléments en deux groupes tout en préservant leur ordre relatif au sein de chaque groupe
(objet fonction d'algorithme)