std::stable_partition en C++

El algoritmo de partición_estable( ) organiza la secuencia definida por inicio y fin de modo que todos los elementos para los que el predicado especificado por pfn devuelve verdadero vienen antes de aquellos para los que el predicado devuelve falso. La partición es estable. Esto significa que se conserva el orden relativo de la secuencia.
Sintaxis:

template 
BiIter stable_partition(BiIter start, BiIter end, UnPred pfn);

Parámetros:

start:  the range of elements to reorder
end:  the range of elements to reorder
pfn:  User-defined predicate function object that 
defines the condition to be satisfied if an element is to be classified.
A predicate takes single argument and returns true or false.
Return Value: 
Returns an iterator to the beginning of the elements 
for which the predicate is false.

Esta función intenta asignar un búfer temporal. Si la asignación falla, se elige el algoritmo menos eficiente.
Ejemplo 1:

// CPP program to illustrate stable_partition
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
    vector<int> v{ 6, 9, 0, 1, 2, 7, 5, 8, 0 };
    stable_partition(v.begin(), v.end(), [](int n) {return n>0; });
    for (int n : v) {
        cout << n << ' ';
    }
    cout << '\n';
}

Producción:

6 9 1 2 7 5 8 0 0 

Ejemplo 2:

// CPP program to illustrate stable_partition
#include <iostream>
#include <algorithm> // std::stable_partition
#include <vector>
  
bool odd(int i) { return (i % 2) == 1; }
  
int main()
{
    std::vector<int> vct;
  
    for (int i = 1; i < 10; ++i)
        vct.push_back(i); // 1 2 3 4 5 6 7 8 9
  
    std::vector<int>::iterator bound;
    bound = std::stable_partition(vct.begin(), vct.end(), odd);
  
    std::cout << "odd numbers:";
    for (std::vector<int>::iterator it = vct.begin(); it != bound; ++it)
        std::cout << ' ' << *it;
    std::cout << '\n';
  
    std::cout << "evennumbers:";
    for (std::vector<int>::iterator it = bound; it != vct.end(); ++it)
        std::cout << ' ' << *it;
    std::cout << '\n';
  
    return 0;
}

Producción:

odd numbers: 1 3 5 7 9
even numbers: 2 4 6 8

Ejemplo 3:

// CPP program to illustrate stable_partition
#include <algorithm>
#include <deque>
#include <functional>
#include <iostream>
#include <iterator>
  
template <class Arg>
struct is_even : public std::unary_function<Arg, bool> {
    bool operator()(const Arg& arg1) const
    {
        return (arg1 % 2) == 0;
    }
};
  
int main()
{
    typedef std::deque<int, std::allocator<int> > Deque;
    typedef std::ostream_iterator<int, char,
                                  std::char_traits<char> >
        Iter;
  
    const Deque::value_type a[] = { 1, 2, 3, 4, 5,
                                    6, 7, 8, 9, 10 };
  
    Deque d1(a + 0, a + sizeof a / sizeof *a);
    Deque d2(d1);
  
    std::cout << "Unpartitioned values: \t\t";
    std::copy(d1.begin(), d1.end(), Iter(std::cout, " "));
  
    std::partition(d2.begin(), d2.end(), is_even<int>());
    std::cout << "\nPartitioned values: \t\t";
    std::copy(d2.begin(), d2.end(), Iter(std::cout, " "));
  
    std::stable_partition(d1.begin(), d1.end(),
                          is_even<int>());
    std::cout << "\nStable partitioned values: \t";
    std::copy(d1.begin(), d1.end(), Iter(std::cout, " "));
    std::cout << std::endl;
  
    return 0;
}

Producción:

Unpartitioned values:         1 2 3 4 5 6 7 8 9 10 
Partitioned values:         10 2 8 4 6 5 7 3 9 1 
Stable partitioned values:     2 4 6 8 10 1 3 5 7 9 

Complejidad: exactamente las aplicaciones de inicio final del predicado y, como máximo, los intercambios (final-inicio) * registro (final-inicio) si no hay suficiente memoria o un número lineal de intercambios si hay suficiente memoria disponible.

Este artículo es una contribución de Shivani Ghughtyal . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *