Namespaces
Variants

std::hive<T,Allocator>::unique

De es.cppreference.net

 
 
 
 
template< class BinaryPredicate = std::equal_to<T> >
size_type unique( BinaryPredicate binary_pred = BinaryPredicate() );
(desde C++26)

Elimina todos los elementos duplicados consecutivos del contenedor. Solo se deja el primer elemento en cada grupo de elementos iguales.

Más formalmente, para un hive no vacío, borra todos los elementos referidos por el iterador i en el [begin() + 1, end()) para los cuales p(*i, *(i - 1)) es verdadero.

Invalida referencias, punteros e iteradores que se refieran a los elementos borrados. Si el último elemento en *this es borrado, también invalida el iterador pasado-el-final.

El comportamiento no está definido si el comparador correspondiente no establece una relación de equivalencia.

Parámetros

p - predicado binario que devuelve ​true si los elementos deben ser tratados como iguales.

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

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

Si bien la firma no necesita tener const &, la función no debe modificar los objetos que se le pasan 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 hive<T,Allocator>::const_iterator pueda ser desreferenciado y luego convertido implícitamente a ambos. ​

Requisitos de tipo
-
BinaryPredicate debe cumplir los requisitos de BinaryPredicate.

Valor de retorno

El número de elementos eliminados.

Complejidad

Si empty() es true, no se realiza ninguna comparación.

De lo contrario, dado N como std::distance(begin(), end()):  exactamente N-1 aplicaciones del predicado p.

Ejemplo

#include <iostream>
#include <hive>

std::ostream& operator<< (std::ostream& os, const std::hive<int>& container)
{
    for (int val : container)
        os << val << ' ';
    return os << '\n';
}

int main()
{
    std::hive<int> c{1, 2, 2, 3, 3, 2, 1, 1, 2};
    std::cout << "Before unique(): " << c;
    const auto count1 = c.unique();
    std::cout << "After unique():  " << c
              << count1 << " elements were removed\n";
    
    c = {1, 2, 12, 23, 3, 2, 51, 1, 2, 2};
    std::cout << "\nBefore unique(pred): " << c;
    
    const auto count2 = c.unique([mod = 10](int x, int y)
    {
        return (x % mod) == (y % mod);
    });
    
    std::cout << "After unique(pred):  " << c
              << count2 << " elements were removed\n";
}

Salida:

Before unique(): 1 2 2 3 3 2 1 1 2
After unique():  1 2 3 2 1 2
3 elements were removed

Before unique(pred): 1 2 12 23 3 2 51 1 2 2
After unique(pred):  1 2 23 2 51 2
4 elements were removed

Véase también

elimina elementos duplicados consecutivos en un rango
(plantilla de función & objeto de función de algoritmo)