std::unique_copy
Defined in header
<algorithm>
|
||
template< class InputIt, class OutputIt >
OutputIt unique_copy( InputIt first, InputIt last, |
(1) | |
template< class ExecutionPolicy, class InputIt, class OutputIt >
OutputIt unique_copy( ExecutionPolicy&& policy, InputIt first, InputIt last, |
(2) | (since C++17) |
template< class InputIt, class OutputIt, class BinaryPredicate >
OutputIt unique_copy( InputIt first, InputIt last, |
(3) | |
template< class ExecutionPolicy, class InputIt, class OutputIt, class BinaryPredicate >
OutputIt unique_copy( ExecutionPolicy&& policy, InputIt first, InputIt last, |
(4) | (since C++17) |
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.
operator==
.p
.policy
. These overloads do not participate in overload resolution unless std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> is true
Contents |
[edit] 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 | - | binary predicate which returns true if the elements should be treated as equal. The signature of the predicate function should be equivalent to the following: bool pred(const Type1 &a, const Type2 &b); The signature does not need to have const &, but the function must not modify the objects passed to it. |
Type requirements | ||
-
InputIt must meet the requirements of InputIterator .
|
||
-
OutputIt must meet the requirements of OutputIterator .
|
||
-The type of dereferenced InputIt must meet the requirements of CopyAssignable . if InputIt does not satisfy ForwardIterator
|
||
-The type of dereferenced InputIt must meet the requirements of CopyConstructible . if neither InputIt nor OutputIt satisfies ForwardIterator , or if InputIt does not satisfy ForwardIterator and the value type of InputIt differs from that of OutputIt
|
[edit] Return value
Output iterator to the element past the last written element
[edit] Complexity
For nonempty ranges, exactly std::distance(first, last) - 1 applications of the corresponding comparator.
[edit] 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,
-
- if
policy
is std::parallel_vector_execution_policy, std::terminate is called - if
policy
is std::sequential_execution_policy or std::parallel_execution_policy, the algorithm exits with an std::exception_list containing all uncaught exceptions. If there was only one uncaught exception, the algorithm may rethrow it without wrapping in std::exception_list. It is unspecified how much work the algorithm will perform before returning after the first exception was encountered. - if
policy
is some other type, the behavior is implementation-defined
- if
- If the algorithm fails to allocate memory (either for itself or to construct an std::exception_list when handling a user exception), std::bad_alloc is thrown.
[edit] Notes
If InputIt satisfies ForwardIterator
, this function rereads the input in order to detect duplicates.
Otherwise, if OutputIt satisfies ForwardIterator
, 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.
[edit] Example
#include <string> #include <iostream> #include <algorithm> #include <iterator> int main() { std::string s1 = "The string with many spaces!"; 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 == ' ' && c2 == ' '; }); std::cout << "after: " << s2 << '\n'; }
Output:
before: The string with many spaces! after: The string with many spaces!
[edit] See also
finds the first two adjacent items that are equal (or satisfy a given predicate) (function template) |
|
removes consecutive duplicate elements in a range (function template) |
|
(parallelism TS)
|
parallelized version of std::unique_copy (function template) |