Namespaces
Variants

std:: prev_permutation

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
prev_permutation

C library
Numeric operations
Operations on uninitialized memory
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.

1) Die Menge aller Permutationen ist lexikographisch geordnet bezüglich operator < (until C++20) std:: less { } (since C++20) .
2) Die Menge aller Permutationen ist lexikographisch geordnet bezüglich comp .

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) Type1 und Type2 unabhängig von der Wertkategorie akzeptieren können (daher ist Type1 & nicht erlaubt , ebenso wenig wie Type1 , es sei denn, für Type1 ist eine Verschiebung äquivalent zu einer Kopie (seit C++11) ).
Die Typen Type1 und Type2 müssen so beschaffen sein, dass ein Objekt vom Typ BidirIt dereferenziert und dann implizit in beide konvertiert werden kann.

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

1,2) Höchstens
N
2
Vertauschungen.

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;
        }
    }
}
**Hinweis:** Der C++-Code innerhalb der `
`-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

bestimmt, ob eine Sequenz eine Permutation einer anderen Sequenz ist
(Funktions-Template)
erzeugt die nächstgrößere lexikografische Permutation eines Elementbereichs
(Funktions-Template)
erzeugt die nächstkleinere lexikografische Permutation eines Elementbereichs
(Algorithmus-Funktionsobjekt)