Namespaces
Variants
Views
Actions

Difference between revisions of "cpp/algorithm/unique"

From cppreference.com
< cpp‎ | algorithm
(Undo revision 31209 by Marshall (talk))
(Fixed (again) to work with empty ranges)
Line 31: Line 31:
 
ForwardIterator unique(ForwardIterator first, ForwardIterator last)
 
ForwardIterator unique(ForwardIterator first, ForwardIterator last)
 
{
 
{
     if (first != last) {
+
     if (first == last)
         ForwardIterator result = first;
+
         return last;
        while (++first != last) {
+
 
            if (!(*result == *first)) {
+
    ForwardIterator result = first;
                *(++result) = *first;
+
    while (++first != last) {
            }
+
        if (!(*result == *first)) {
 +
            *(++result) = *first;
 
         }
 
         }
 
     }
 
     }
Line 46: Line 47:
 
                       BinaryPredicate p)
 
                       BinaryPredicate p)
 
{
 
{
     if (first != last) {
+
     if (first == last)
         ForwardIterator result = first;
+
         return last;
        while (++first != last) {
+
 
            if (!p(*result, *first)) {
+
    ForwardIterator result = first;
                *(++result) = *first;
+
    while (++first != last) {
            }
+
        if (!p(*result, *first)) {
 +
            *(++result) = *first;
 
         }
 
         }
 
     }
 
     }

Revision as of 13:31, 15 May 2012

Template:cpp/algorithm/sidebar Template:ddcl list begin <tr class="t-dsc-header">

<td>
Defined in header <algorithm>
</td>

<td></td> <td></td> </tr> <tr class="t-dcl ">

<td >
template< class ForwardIterator >
ForwardIterator unique( ForwardIterator first, ForwardIterator last );
</td>

<td > (1) </td> <td class="t-dcl-nopad"> </td> </tr> <tr class="t-dcl ">

<td >
template< class ForwardIterator, class BinaryPredicate >
ForwardIterator unique( ForwardIterator first, ForwardIterator last, BinaryPredicate p );
</td>

<td > (2) </td> <td class="t-dcl-nopad"> </td> </tr> Template:ddcl list end

Removes all consecutive duplicate elements from the range [first, last). Removing is done by shifting the range when needed in such a way that elements to be erased are overwritten. Only the first element in each group of equal elements is left. The elements between the old and the new end or the range are left intact. 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
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);

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, nor is Type1 unless for Type1 a move is equivalent to a copy(since C++11)).
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

forward iterator to the new end of the range

Possible implementation

Template:eq fun cpp

Example

The following code removes all consecutive equivalent elements from a vector of integers.

#include <iostream>
#include <algorithm>
#include <vector>
 
int main() 
{
    std::vector<int> v{1, 2, 2, 2, 3, 3, 2, 2, 1};
    std::vector<int>::iterator last;
 
    last = std::unique(v.begin(), v.end()); // 1 2 3 2 1 3 2 2 1
                                            //           ^
    for (std::vector<int>::iterator it = v.begin(); it != last; ++it) {
        std::cout << *it << " ";
    }
    std::cout << "\n";
}

Output:

1 2 3 2 1

Complexity

linear in the distance between first and last

See also

Template:cpp/algorithm/dcl list adjacent findTemplate:cpp/algorithm/dcl list unique copy