std:: prev_permutation
|
Défini dans l'en-tête
<algorithm>
|
||
|
template
<
class
BidirIt
>
bool prev_permutation ( BidirIt first, BidirIt last ) ; |
(1) | (constexpr depuis C++20) |
|
template
<
class
BidirIt,
class
Compare
>
bool prev_permutation ( BidirIt first, BidirIt last, Compare comp ) ; |
(2) | (constexpr depuis C++20) |
Transforme la plage
[
first
,
last
)
en la permutation précédente. Retourne
true
si une telle permutation existe, sinon transforme la plage en la dernière permutation (comme avec
std::sort
suivi de
std::reverse
) et retourne
false
.
Si
le type de
*
first
n'est pas
Swappable
(jusqu'à C++11)
BidirIt
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 à permuter |
| comp | - |
objet fonction de comparaison (c'est-à-dire un objet qui satisfait aux exigences de
Compare
) qui renvoie
true
si le premier argument est
inférieur
au second.
La signature de la fonction de comparaison doit être équivalente à ce qui suit : bool cmp ( 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)
|
| Exigences de type | ||
-
BidirIt
doit satisfaire aux exigences de
ValueSwappable
et
LegacyBidirectionalIterator
.
|
||
Valeur de retour
true si la nouvelle permutation précède l'ancienne dans l'ordre lexicographique. false si la première permutation a été atteinte et que la plage a été réinitialisée à la dernière permutation.
Exceptions
Toute exception levée par les opérations d'itérateur ou l'échange d'éléments.
Complexité
Étant donné N comme std:: distance ( first, last ) :
| N |
| 2 |
Implémentation possible
template<class BidirIt> bool prev_permutation(BidirIt first, BidirIt last) { if (first == last) return false; BidirIt i = last; if (first == --i) return false; while (1) { BidirIt i1, i2; i1 = i; if (*i1 < *--i) { i2 = last; while (!(*--i2 < *i)) ; std::iter_swap(i, i2); std::reverse(i1, last); return true; } if (i == first) { std::reverse(first, last); return false; } } } |
Notes
En moyenne sur l'ensemble de la séquence de permutations, les implémentations typiques utilisent environ 3 comparaisons et 1,5 échanges par appel.
Les implémentations (par exemple
MSVC STL
) peuvent activer la vectorisation lorsque le type d'itérateur satisfait
LegacyContiguousIterator
et que l'échange de son type de valeur n'appelle ni fonction membre spéciale non triviale ni
ADL
-trouvée
swap
.
Exemple
Le code suivant affiche les six permutations de la chaîne "cab" dans l'ordre inverse.
#include <algorithm> #include <iostream> #include <string> int main() { std::string s = "cab"; do { std::cout << s << ' '; } while (std::prev_permutation(s.begin(), s.end())); std::cout << s << '\n'; }
Sortie :
cab bca bac acb abc cba
Voir aussi
|
(C++11)
|
détermine si une séquence est une permutation d'une autre séquence
(modèle de fonction) |
|
génère la prochaine permutation lexicographique supérieure d'une plage d'éléments
(modèle de fonction) |
|
|
(C++20)
|
génère la prochaine permutation lexicographique inférieure d'une plage d'éléments
(objet fonction algorithme) |