std:: unique_copy
|
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,
|
(2) | (depuis C++17) |
|
template
<
class
InputIt,
class
OutputIt,
class
BinaryPred
>
OutputIt unique_copy
(
InputIt first, InputIt last,
|
(3) | (constexpr depuis C++20) |
|
template
<
class
ExecutionPolicy,
class
ForwardIt1,
class
ForwardIt2,
class
BinaryPred
>
|
(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é.
|
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) |
-
Test à la fois CopyConstructible et CopyAssignable . - Toutes les conditions suivantes sont satisfaites :
-
-
OutputItsatisfait aux exigences de LegacyForwardIterator . -
Le type de valeur de
OutputItest égalementT. -
Test CopyAssignable .
-
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)
|
| 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 ) :
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
ExecutionPolicyfait partie des politiques standard , std::terminate est appelé. Pour tout autreExecutionPolicy, 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) |
|
|
(C++11)
|
copie une plage d'éléments vers un nouvel emplacement
(modèle de fonction) |
|
(C++20)
|
crée une copie d'une plage d'éléments qui ne contient pas de doublons consécutifs
(objet fonction algorithme) |