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
Défini dans l'en-tête <algorithm>
template < class InputIt, class OutputIt >
OutputIt unique_copy ( InputIt first, InputIt last, OutputIt d_first ) ;
(1) (constexpr depuis C++20)
template < class ExecutionPolicy, class ForwardIt1, class ForwardIt2 >

ForwardIt2 unique_copy ( ExecutionPolicy && policy, ForwardIt1 first,

ForwardIt1 last, ForwardIt2 d_first ) ;
(2) (depuis C++17)
template < class InputIt, class OutputIt, class BinaryPred >

OutputIt unique_copy ( InputIt first, InputIt last,

OutputIt d_first, BinaryPred p ) ;
(3) (constexpr depuis 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) (depuis C++17)

Copie les éléments de la plage [ first , last ) vers une autre plage commençant à d_first de telle manière qu'il n'y ait pas d'éléments égaux consécutifs. Seul le premier élément de chaque groupe d'éléments égaux est copié.

1) Les éléments sont comparés en utilisant operator == .
Si operator == n'établit pas une relation d'équivalence , le comportement est indéfini.
3) Les éléments sont comparés en utilisant le prédicat binaire donné p .
Si p n'établit pas une relation d'équivalence, le comportement est indéfini.
2,4) Identique à (1,3) , mais exécuté selon la policy .
Ces surcharges participent à la résolution de surcharge seulement si toutes les conditions suivantes sont satisfaites :

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

(jusqu'à C++20)

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

(depuis C++20)

Si * d_first = * first est invalide (jusqu'à C++20) * first n'est pas accessible en écriture vers d_first (depuis C++20) , le programme est mal formé.

Si les plages source et destination se chevauchent, le comportement est indéfini.

Étant donné T comme type de valeur de InputIt , si la surcharge (1) ou (3) ne satisfait pas à toutes les conditions suivantes, le comportement est indéfini :

(jusqu'en C++20)
(depuis C++20)

Table des matières

Paramètres

first, last - la paire d'itérateurs définissant la plage source des éléments à traiter
d_first - le début de la plage de destination
policy - la politique d'exécution à utiliser
p - prédicat binaire qui renvoie ​ true si les éléments doivent être traités comme égaux.

La signature de la fonction de prédicat doit être équivalente à ce qui suit :

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

Bien que la signature n'ait pas besoin d'avoir const & , la fonction ne doit pas modifier les objets qui lui sont passés et doit pouvoir accepter toutes les valeurs du type (éventuellement const) Type1 et Type2 indépendamment de la catégorie de valeur (ainsi, Type1 & n'est pas autorisé , pas plus que Type1 sauf si pour Type1 un déplacement équivaut à une copie (depuis C++11) ).
Les types Type1 et Type2 doivent être tels qu'un objet de type InputIt puisse être déréférencé puis implicitement converti vers les deux. ​

Exigences de type
-
InputIt doit satisfaire aux exigences de LegacyInputIterator .
-
OutputIt doit satisfaire aux exigences de LegacyOutputIterator .
-
ForwardIt1, ForwardIt2 doit satisfaire aux exigences de LegacyForwardIterator .

Valeur de retour

Itérateur de sortie vers l'élément situé après le dernier élément écrit.

Complexité

Étant donné N comme std:: distance ( first, last ) :

1,2) Exactement max(0,N-1) comparaisons en utilisant operator == .
3,4) Exactement max(0,N-1) applications du prédicat p .

Pour les surcharges (2,4) , il peut y avoir un coût de performance si le type de valeur de ForwardIt1 n'est pas à la fois CopyConstructible et CopyAssignable .

Exceptions

Les surcharges avec un paramètre de modèle nommé ExecutionPolicy signalent les erreurs comme suit :

  • Si l'exécution d'une fonction invoquée dans le cadre de l'algorithme lève une exception et que ExecutionPolicy fait partie des politiques standard , std::terminate est appelé. Pour tout autre ExecutionPolicy , le comportement est défini par l'implémentation.
  • Si l'algorithme ne parvient pas à allouer de la mémoire, std::bad_alloc est levé.

Implémentation possible

Voir également les implémentations dans libstdc++ et libc++ .

Notes

Si InputIt satisfait LegacyForwardIterator , cette fonction relit l'entrée afin de détecter les doublons.

Sinon, si OutputIt satisfait LegacyForwardIterator , et que le type de valeur de InputIt est le même que celui de OutputIt , cette fonction compare * d_first à * first .

Sinon, cette fonction compare * first à une copie locale d'élément.

Exemple

#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';
}

Sortie :

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

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR Appliqué à Comportement tel que publié Comportement correct
LWG 239 C++98 le prédicat était appliqué std:: distance ( first, last ) fois appliqué une fois de moins
(pour les plages non vides)
LWG 241 C++98 le type de valeur de InputIt n'était pas requis d'être CopyConstructible conditionnellement requis
LWG 538 C++98 le type de valeur de InputIt n'était pas requis d'être CopyAssignable conditionnellement requis
LWG 2439 C++98 le type de valeur de InputIt n'était pas requis d'être
CopyConstructible si OutputIt est un LegacyForwardIterator
conditionnellement requis

Voir aussi

trouve les deux premiers éléments adjacents qui sont égaux (ou satisfont un prédicat donné)
(modèle de fonction)
supprime les éléments dupliqués consécutifs dans une plage
(modèle de fonction)
copie une plage d'éléments vers un nouvel emplacement
(modèle de fonction)
crée une copie d'une plage d'éléments qui ne contient pas de doublons consécutifs
(objet fonction algorithme)