std:: prev_permutation
|
Definiert im Header
<algorithm>
|
||
|
template
<
class
BidirIt
>
bool prev_permutation ( BidirIt first, BidirIt last ) ; |
(1) | (constexpr seit C++20) |
|
template
<
class
BidirIt,
class
Compare
>
bool prev_permutation ( BidirIt first, BidirIt last, Compare comp ) ; |
(2) | (constexpr seit C++20) |
Transformiert den Bereich
[
first
,
last
)
in die vorherige
Permutation
. Gibt
true
zurück, falls eine solche Permutation existiert, andernfalls wird der Bereich in die letzte Permutation transformiert (wie durch
std::sort
gefolgt von
std::reverse
) und gibt
false
zurück.
Wenn
der Typ von
*
first
nicht
Swappable
(bis C++11)
BidirIt
nicht
ValueSwappable
(seit C++11)
ist, ist das Verhalten undefiniert.
Inhaltsverzeichnis |
Parameter
| first, last | - | das Paar von Iteratoren, das den Bereich der zu permutierenden Elemente definiert |
| comp | - |
Vergleichsfunktionsobjekt (d.h. ein Objekt, das die Anforderungen von
Compare
erfüllt), das
true
zurückgibt, wenn das erste Argument
kleiner
als das zweite ist.
Die Signatur der Vergleichsfunktion sollte äquivalent zu Folgender sein: bool cmp ( const Type1 & a, const Type2 & b ) ;
Obwohl die Signatur nicht
const
&
benötigt, darf die Funktion die übergebenen Objekte nicht modifizieren und muss alle Werte der Typen (möglicherweise const)
|
| Typanforderungen | ||
-
BidirIt
muss die Anforderungen von
ValueSwappable
und
LegacyBidirectionalIterator
erfüllen.
|
||
Rückgabewert
true wenn die neue Permutation der alten in lexikographischer Ordnung vorausgeht. false wenn die erste Permutation erreicht wurde und der Bereich auf die letzte Permutation zurückgesetzt wurde.
Ausnahmen
Alle Ausnahmen, die von Iterator-Operationen oder dem Elementaustausch ausgelöst werden.
Komplexität
Gegeben N als std:: distance ( first, last ) :
| N |
| 2 |
Mögliche Implementierung
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; } } } |
`-Tags wurde gemäß den Anweisungen nicht übersetzt, da er Code darstellt und C++-spezifische Begriffe enthält. Die HTML-Struktur und Attribute bleiben ebenfalls unverändert.
Hinweise
Im Durchschnitt über die gesamte Sequenz von Permutationen verwenden typische Implementierungen etwa 3 Vergleiche und 1,5 Vertauschungen pro Aufruf.
Implementierungen (z.B.
MSVC STL
) können Vektorisierung ermöglichen, wenn der Iteratortyp
LegacyContiguousIterator
erfüllt und das Vertauschen seines Werttyps weder nicht-triviale spezielle Memberfunktionen noch
ADL
-gefundene
swap
-Funktionen aufruft.
Beispiel
Der folgende Code gibt alle sechs Permutationen der Zeichenkette "cab" in umgekehrter Reihenfolge aus.
#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'; }
Ausgabe:
cab bca bac acb abc cba
Siehe auch
|
(C++11)
|
bestimmt, ob eine Sequenz eine Permutation einer anderen Sequenz ist
(Funktions-Template) |
|
erzeugt die nächstgrößere lexikografische Permutation eines Elementbereichs
(Funktions-Template) |
|
|
(C++20)
|
erzeugt die nächstkleinere lexikografische Permutation eines Elementbereichs
(Algorithmus-Funktionsobjekt) |