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 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.
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; }
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