Defined in header <algorithm> | ||
---|---|---|
template< class InputIt, class OutputIt > OutputIt unique_copy( InputIt first, InputIt last, OutputIt d_first ); | (1) | |
template< class InputIt, class OutputIt, class BinaryPredicate > OutputIt unique_copy( InputIt first, InputIt last, OutputIt d_first, BinaryPredicate p ); | (2) |
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. The first version uses operator==
to compare the elements, the second version uses the given binary predicate p
.
Parameters
first, last | - | the range of elements to process |
d_first | - | the beginning of the destination range |
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:
The signature does not need to have |
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 |
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 comparator.
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.
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!
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) | |
std::experimental::parallel::unique_copy
(parallelism TS) | parallelized version of std::unique_copy (function template) |
Please login to continue.