Namespaces
Variants

std::unique_copy

De es.cppreference.net
 
 
Biblioteca de algoritmos
Algoritmos restringidos y algoritmos sobre rangos (C++20)
Algoritmos restringidos, ej. ranges::copy, ranges::sort, ...
Operaciones de secuencia no modificadoras    
Operaciones por lotes
(C++17)
Operaciones de búsqueda
Operaciones de secuencia modificadoras
Operaciones de copia
(C++11)
(C++11)
Operaciones de intercambio
Operaciones de transformación
Operaciones de generación
Operaciones de eliminación
Operaciones de cambio de orden
(hasta C++17)(C++11)
(C++20)(C++20)
Operaciones de muestreo
(C++17)

Operaciones de ordenación y relacionadas
Operaciones de particionamiento
(C++11)    

Operaciones de ordenación
Operaciones de búsqueda binaria
(en rangos particionados)
Operaciones de conjuntos (en rangos ordenados)
Operaciones de fusión (en rangos ordenados)
Operaciones de montículo
Operaciones de mínimo/máximo
(C++11)
(C++17)
Operaciones de comparación lexicográfica
Operaciones de permutación


 
Definido en el encabezado <algorithm>
template< class InputIt, class OutputIt >
OutputIt unique_copy( InputIt first, InputIt last, OutputIt d_first );
(1) (constexpr desde C++20)
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 >
ForwardIt2 unique_copy( ExecutionPolicy&& policy, ForwardIt1 first,
                        ForwardIt1 last, ForwardIt2 d_first );
(2) (desde C++17)
template< class InputIt, class OutputIt, class BinaryPred >
OutputIt unique_copy( InputIt first, InputIt last,
                      OutputIt d_first, BinaryPred p );
(3) (constexpr desde C++20)
template< class ExecutionPolicy, class ForwardIt1,
          class ForwardIt2, class BinaryPred >
ForwardIt2 unique_copy( ExecutionPolicy&& policy,
                        ForwardIt1 first, ForwardIt1 last,
                        ForwardIt2 d_first, BinaryPred p );
(4) (desde C++17)

Copia los elementos del rango [first, last), a otro rango comenzando en d_first de tal manera que no haya elementos iguales consecutivos. Solo se copia el primer elemento de cada grupo de elementos iguales.

1) Los elementos se comparan usando operator==.
Si operator== no establece una relación de equivalencia, el comportamiento no está definido.
3) Los elementos se comparan usando el predicado binario dado p.
Si p no establece una relación de equivalencia, el comportamiento no está definido.
2,4) Igual que (1,3), pero ejecutado de acuerdo a policy.
Estas sobrecargas participan en la resolución de sobrecarga solo si el valor de la siguiente expresión es true:

std::is_execution_policy_v<std::decay_t<ExecutionPolicy>>

(hasta C++20)

std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>>

(desde C++20)

Si *d_first = *first es inválido(hasta C++20)*first no es escribible a d_first(desde C++20), el programa está mal formado.

Si los rangos de origen y destino se superponen, el comportamiento no está definido.

Dado T como el tipo de valor de InputIt, si la sobrecarga (1) o (3) no satisface todas las siguientes condiciones, el comportamiento no está definido:

(hasta C++20)
(desde C++20)

Parámetros

first, last - el par de iteradores que define el rango fuente de elementos a procesar
d_first - el inicio del rango destino
policy - la política de ejecución a utilizar
p - predicado binario que retorna ​ true si los elementos deben tratarse como iguales.

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

bool pred ( 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 InputIt pueda ser desreferenciado y luego convertido implícitamente a ambos. ​

Requisitos de tipo
-
InputIt debe cumplir con los requisitos de LegacyInputIterator .
-
OutputIt debe cumplir con los requisitos de LegacyOutputIterator .
-
ForwardIt1, ForwardIt2 debe cumplir con los requisitos de LegacyForwardIterator .

Valor de retorno

Iterador de salida al elemento después del último elemento escrito.

Complejidad

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

1,2) Exactamente max(0,N-1) comparaciones usando operator == .
3,4) Exactamente max(0,N-1) aplicaciones del predicado p .

Para las sobrecargas (2,4) , puede haber un costo de rendimiento si el tipo de valor de ForwardIt1 no es tanto CopyConstructible como CopyAssignable .

Excepciones

Las sobrecargas con un parámetro de plantilla llamado ExecutionPolicy reportan errores de la siguiente manera:

  • Si la ejecución de una función invocada como parte del algoritmo lanza una excepción y ExecutionPolicy es uno de los standard policies , std::terminate es llamado. Para cualquier otro ExecutionPolicy , el comportamiento está definido por la implementación.
  • Si el algoritmo falla al asignar memoria, std::bad_alloc es lanzado.

Implementación posible

Consulte también las implementaciones en libstdc++ y libc++ .

Notas

Si InputIt satisface LegacyForwardIterator , esta función vuelve a leer la entrada para detectar duplicados.

De lo contrario, si OutputIt satisface LegacyForwardIterator , y el tipo de valor de InputIt es el mismo que el de OutputIt , esta función compara * d_first con * first .

De lo contrario, esta función compara * first con una copia local del elemento.

Ejemplo

#include <algorithm>
#include <iostream>
#include <iterator>
#include <string>
int main()
{
    std::string s1 {"A string with mmmany letters!"};
    std::cout << "Before: " << s1 << '\n';
    std::string s2;
    std::unique_copy(s1.begin(), s1.end(), std::back_inserter(s2),
                     [](char c1, char c2) { return c1 == 'm' && 'm' == c2; });
    std::cout << "After:  " << s2 << '\n';
}

Salida:

Before: A string with mmmany letters!
After:  A string with many letters!

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 239 C++98 el predicado se aplicaba std:: distance ( first, last ) veces se aplica una vez menos
(para rangos no vacíos)
LWG 241 C++98 el tipo de valor de InputIt no requería ser CopyConstructible requerido condicionalmente
LWG 538 C++98 el tipo de valor de InputIt no requería ser CopyAssignable requerido condicionalmente
LWG 2439 C++98 el tipo de valor de InputIt no requería ser
CopyConstructible si OutputIt es un LegacyForwardIterator
requerido condicionalmente

Véase también

encuentra los dos primeros elementos adyacentes que son iguales (o que satisfacen un predicado dado)
(plantilla de función & objeto función de algoritmo)
elimina elementos duplicados consecutivos en un rango
(plantilla de función & objeto función de algoritmo)
copia un rango de elementos a una nueva ubicación
(plantilla de función & objeto función de algoritmo)
crea una copia de algún rango de elementos que no contiene duplicados consecutivos
(objeto función de algoritmo)