std::unique_copy (3) - Linux Manuals
std::unique_copy: std::unique_copy
NAME
std::unique_copy - std::unique_copy
Synopsis
Defined in header <algorithm>
template< class InputIt, class OutputIt >
OutputIt unique_copy( InputIt first, InputIt last, (until C++20)
OutputIt d_first );
template< class InputIt, class OutputIt >
constexpr OutputIt unique_copy( InputIt first, InputIt last, (since C++20)
OutputIt d_first );
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2 >
ForwardIt2 unique_copy( ExecutionPolicy&& policy, ForwardIt1 first, ForwardIt1 last, (2) (since C++17)
ForwardIt2 d_first ); (1)
template< class InputIt, class OutputIt, class BinaryPredicate >
OutputIt unique_copy( InputIt first, InputIt last, (until C++20)
OutputIt d_first, BinaryPredicate p );
template< class InputIt, class OutputIt, class BinaryPredicate >
constexpr OutputIt unique_copy( InputIt first, InputIt last, (3) (since C++20)
OutputIt d_first, BinaryPredicate p );
template< class ExecutionPolicy, class ForwardIt1, class ForwardIt2, class BinaryPredicate >
ForwardIt2 unique_copy( ExecutionPolicy&& policy, ForwardIt1 first, ForwardIt1 last, (4) (since C++17)
ForwardIt2 d_first, BinaryPredicate p );
Copies the elements from the range [first, last), to another range beginning at d_first in such a way that there are no consecutive equal elements. Only the first element of each group of equal elements is copied.
1) Elements are compared using operator==. The behavior is undefined if it is not an equivalence_relation.
3) Elements are compared using the given binary predicate p. The behavior is undefined if it is not an equivalence relation.
2,4) Same as (1,3), but executed according to policy. This overload only participates in overload resolution if std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> is true
Parameters
first, last - the range of elements to process
d_first - the beginning of the destination range
policy - the execution policy to use. See execution_policy for details.
p - While the signature does not need to have const &, the function must not modify the objects passed to it and must be able to accept all values of type (possibly const) Type1 and Type2 regardless of value_category (thus, Type1 & is not allowed
Type requirements
-
InputIt must meet the requirements of LegacyInputIterator.
-
OutputIt must meet the requirements of LegacyOutputIterator.
-
ForwardIt1, ForwardIt2 must meet the requirements of LegacyForwardIterator.
-
The type of dereferenced InputIt must meet the requirements of CopyAssignable. if InputIt does not satisfy LegacyForwardIterator
-
The type of dereferenced InputIt must meet the requirements of CopyConstructible. if neither InputIt nor OutputIt satisfies LegacyForwardIterator, or if InputIt does not satisfy LegacyForwardIterator and the value type of InputIt differs from that of OutputIt
Return value
Output iterator to the element past the last written element
Complexity
For nonempty ranges, exactly std::distance(first, last) - 1 applications of the corresponding predicate.
Exceptions
The overloads with a template parameter named ExecutionPolicy report errors as follows:
* If execution of a function invoked as part of the algorithm throws an exception and ExecutionPolicy is one of the standard_policies, std::terminate is called. For any other ExecutionPolicy, the behavior is implementation-defined.
* If the algorithm fails to allocate memory, std::bad_alloc is thrown.
Notes
If InputIt satisfies LegacyForwardIterator, this function rereads the input in order to detect duplicates.
Otherwise, if OutputIt satisfies LegacyForwardIterator, and the value type of InputIt is the same as that of OutputIt, this function compare *d_first to *first.
Otherwise, this function compares *first to a local element copy.
For the overloads with an ExecutionPolicy, there may be a performance cost if the value type of ForwardIterator1 is not both CopyConstructible and CopyAssignable
Example
// Run this code
Output:
See also
adjacent_find (function template)
unique (function template)