std::unique_copy

From Cppreference

Jump to: navigation, search
Defined in header <algorithm>

template< class ForwardIterator, class OutputIterator >

ForwardIterator unique_copy( ForwardIterator first, ForwardIterator last,

                             OutputIterator d_first );
(1)
template< class ForwardIterator, class OutputIterator, class BinaryPredicate >

ForwardIterator unique_copy( ForwardIterator first, ForwardIterator last,

                             OutputIterator 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.

Contents

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:

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.
The types ​Type1​ and ​Type2​ must be such that an object of type ​ForwardIterator​ can be dereferenced and then implicitly converted to both of them.

Return value

output iterator to the element past the last written element

Equivalent function

First version:
template<class ForwardIterator, class OutputIterator>
ForwardIterator unique_copy(ForwardIterator first, ForwardIterator last,
                            OutputIterator d_first)
{
 
    *d_first=*first;
    while (++first != last) {
        if (!(*d_first == *first)) {
            *(++d_first) = *first;
        }
    }
    return ++d_first;
}
Second version:
template<class ForwardIterator, class OutputIterator, class BinaryPredicate>
ForwardIterator unique_copy(ForwardIterator first, ForwardIterator last,
                            OutputIterator d_first, BinaryPredicate p)
{
 
    *d_first=*first;
    while (++first != last) {
        if (!p(*result, *first)) {
            *(++d_first) = *first;
        }
    }
    return ++d_first;
}

Example

Complexity

linear in the distance between first and last

See also

adjacent_find
finds two identical (or some other relationship) items adjacent to each other
(function template)
unique
removes consecutive duplicate elements in a range
(function template)
Personal tools
Namespaces
Variants
Actions
Navigation
Toolbox
In other languages