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
Definido en el encabezado <algorithm>
template < class BidirIt >
bool prev_permutation ( BidirIt first, BidirIt last ) ;
(1) (constexpr desde C++20)
template < class BidirIt, class Compare >
bool prev_permutation ( BidirIt first, BidirIt last, Compare comp ) ;
(2) (constexpr desde C++20)

Transforma el rango [ first , last ) en la permutación anterior. Devuelve true si existe dicha permutación; de lo contrario, transforma el rango en la última permutación (como si se usara std::sort seguido de std::reverse ) y devuelve false .

1) El conjunto de todas las permutaciones está ordenado lexicográficamente con respecto a operator < (until C++20) std:: less { } (since C++20) .
2) El conjunto de todas las permutaciones está ordenado lexicográficamente con respecto a comp .

Si el tipo de * first no es Swappable (hasta C++11) BidirIt no es ValueSwappable (desde C++11) , el comportamiento es indefinido.

Contenidos

Parámetros

first, last - el par de iteradores que define el rango de elementos a permutar
comp - objeto función de comparación (es decir, un objeto que satisface los requisitos de Compare ) que devuelve true si el primer argumento es menor que el segundo.

La firma de la función de comparación debe ser equivalente a la siguiente:

bool cmp ( const Type1 & a, const Type2 & b ) ;

Aunque la firma no necesita tener const & , la función no debe modificar los objetos pasados a ella y debe poder aceptar todos los valores de tipo (posiblemente const) Type1 y Type2 independientemente de la categoría de valor (por lo tanto, Type1 & no está permitido , ni tampoco Type1 a menos que para Type1 un movimiento sea equivalente a una copia (desde C++11) ).
Los tipos Type1 y Type2 deben ser tales que un objeto de tipo BidirIt pueda ser desreferenciado y luego convertido implícitamente a ambos.

Requisitos de tipo
-
BidirIt debe cumplir con los requisitos de ValueSwappable y LegacyBidirectionalIterator .

Valor de retorno

true si la nueva permutación precede a la antigua en orden lexicográfico. false si se alcanzó la primera permutación y el rango se restableció a la última permutación.

Excepciones

Cualquier excepción lanzada desde operaciones de iteradores o el intercambio de elementos.

Complejidad

Dado N como std:: distance ( first, last ) :

1,2) Como máximo
N
2
intercambios.

Implementación posible

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;
        }
    }
}

Notas

Promediado sobre toda la secuencia de permutaciones, las implementaciones típicas utilizan aproximadamente 3 comparaciones y 1.5 intercambios por llamada.

Las implementaciones (por ejemplo, MSVC STL ) pueden habilitar la vectorización cuando el tipo de iterador satisface LegacyContiguousIterator y el intercambio de su tipo de valor no llama ni a funciones miembro especiales no triviales ni a ADL -encontrado swap .

Ejemplo

El siguiente código imprime las seis permutaciones de la cadena "cab" en orden inverso.

#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';
}

Salida:

cab bca bac acb abc cba

Véase también

determina si una secuencia es una permutación de otra secuencia
(plantilla de función)
genera la siguiente permutación lexicográfica mayor de un rango de elementos
(plantilla de función)
genera la siguiente permutación lexicográfica menor de un rango de elementos
(objeto función de algoritmo)