Namespaces
Variants

std:: unique_copy

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
C library
Numeric operations
Operations on uninitialized memory
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 que comienza en d_first de tal manera que no haya elementos consecutivos iguales. Solo se copia el primer elemento de cada grupo de elementos iguales.

1) Los elementos se comparan utilizando operator == .
Si operator == no establece una relación de equivalencia , el comportamiento es indefinido.
3) Los elementos se comparan utilizando el predicado binario dado p .
Si p no establece una relación de equivalencia, el comportamiento es indefinido.
2,4) Igual que (1,3) , pero ejecutado de acuerdo con la policy .
Estas sobrecargas participan en la resolución de sobrecarga solo si se satisfacen todas las siguientes condiciones:

std:: is_execution_policy_v < std:: decay_t < ExecutionPolicy >> es true .

(hasta C++20)

std:: is_execution_policy_v < std:: remove_cvref_t < ExecutionPolicy >> es true .

(desde C++20)

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

Si los rangos de origen y destino se superponen, el comportamiento es indefinido.

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

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

Contenidos

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 satisfacen un predicado dado)
(function template)
elimina elementos duplicados consecutivos en un rango
(function template)
copia un rango de elementos a una nueva ubicación
(function template)
crea una copia de algún rango de elementos que no contiene duplicados consecutivos
(algorithm function object)