unique

De cppreference.com
Saltar a: navegación, buscar

Sintaxis:

#include <algorithm>
 
template< class ForwardIterator >
ForwardIterator unique( ForwardIterator inicio, ForwardIterator final );
 
template< class ForwardIterator, class Predicate >
ForwardIterator unique( ForwardIterator inicio, ForwardIterator final, Predicate iguales );

El algoritmo unique() remueve de un rango [inicio, final) todos los elementos consecutivos duplicados. La eliminación se lleva a cabo deslizando porciones del rango cuando es necesario de modo que valores repetidos se sobreescriben. Sólo el primer elemento de un grupo de iguales consecutivos permanece en su lugar.

Los parámetros inicio y final delimitan el rango. unique() puede usar dos métodos para comparar los elementos: el operador operator== cuando se invoca unique() con dos parámetros, o un [[cpp/algorithm/wp>es:Predicado | predicado]] iguales(a,b) que devuelve true si los valores a y b son iguales, cuando es pasado como tercer parámetro.

El algoritmo devuelve un iterador apuntando al nuevo final del rango.

unique() se ejecuta en tiempo lineal en el tamaño del rango.

[editar] Modelo de Implementación

Una implementación de unique() tendrá un comportamiento similar al código siguiente:

template<class ForwardIterator, class Predicate>
ForwardIterator unique(ForwardIterator inicio, ForwardIterator final, Predicate iguales)
{
    ForwardIterator nuevofinal = inicio;
    while (++inicio != final) {
        if (!iguales(*nuevofinal == *inicio)) {
******(++nuevofinal) = *inicio;
        }
    }
    return ++nuevofinal;
}

[editar] Ejemplo

FIXME Traducir


#include <iostream>
#include <algorithm>
#include <vector>
 
int main () {
    int myints[] = {10,20,20,20,30,30,20,20,10};
    std::vector<int> v(myints, myints + 9);
    std::vector<int>::iterator last;
 
    last = std::unique(v.begin(), v.end()); // 10 20 30 20 10 30 20 20 10
                                            //                ^                                    
    for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it) {
        std::cout << *it << " ";
    }
 
    return 0;
}

Salida:

10 20 30 20 10

[editar] Tópicos Relacionados

adjacent_find, remove, unique_copy

Herramientas personales
Espacios de nombres
Variantes
Acciones
Navegación
Herramientas
Otros idiomas