Namespaces
Variants

std:: next_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
next_permutation

C library
Numeric operations
Operations on uninitialized memory
Definido en el encabezado <algorithm>
template < class BidirIt >
bool next_permutation ( BidirIt first, BidirIt last ) ;
(1) (constexpr desde C++20)
template < class BidirIt, class Compare >
bool next_permutation ( BidirIt first, BidirIt last, Compare comp ) ;
(2) (constexpr desde C++20)

Permuta el rango [ first , last ) a la siguiente permutación . Devuelve true si existe tal "siguiente permutación"; de lo contrario transforma el rango en la primera permutación lexicográfica (como si fuera mediante std::sort ) 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 (since 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 LegacyBidirectionalIterator .

Valor de retorno

true si la nueva permutación es lexicográficamente mayor que la anterior. false si se alcanzó la última permutación y el rango se reinició a la primera permutación.

Complejidad

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

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

Excepciones

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

Implementación posible

template<class BidirIt>
bool next_permutation(BidirIt first, BidirIt last)
{
    auto r_first = std::make_reverse_iterator(last);
    auto r_last = std::make_reverse_iterator(first);
    auto left = std::is_sorted_until(r_first, r_last);
    if (left != r_last)
    {
        auto right = std::upper_bound(r_first, left, *left);
        std::iter_swap(left, right);
    }
    std::reverse(left.base(), last);
    return left != r_last;
}

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 tres permutaciones de la cadena "aba" .

#include <algorithm>
#include <iostream>
#include <string>
int main()
{
    std::string s = "aba";
    do
    {
        std::cout << s << '\n';
    }
    while (std::next_permutation(s.begin(), s.end()));
    std::cout << s << '\n';
}

Salida:

aba
baa
aab

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 menor de un rango de elementos
(plantilla de función)
genera la siguiente permutación lexicográfica mayor de un rango de elementos
(objeto función de algoritmo)