Шаблонна функція std::unique призначена для видалення послідовностей еквівалентних елементів у вказаному проміжку. Оголошення функції виглядає наступним чином:
template <class ForwardIterator>
ForwardIterator unique (ForwardIterator first, ForwardIterator last) ;
Параметри ітератори first i last призначені для вказування проміжку, у якому повинно виконуватися видалення послідовностей еквівалентних елементів. Функція залишає лише унікальні значення тільки у сортованій послідовності.
Функція не повинна змінювати властивості елементів послідовності і її розмір. Видалення виконується завдяки заміні повторюваних значень відмінними новими.
Повернене значення вказує на елемент, який стоїть після останнього обробленого. Усі наступні елементи разом з даним, являються валідними, але їх значення невизначені.
Щоб використовувати дану функцію необхідно підключити файл algorithm
#include <algorithm> /* усе корисне разом з unique */
Приклад
Розглянемо простий приклад використання даної функції відносно сортованої і несортованої послідовності вектора.
#include <iostream> /* об'єкт cout */
#include <algorithm> /* функція unique */
#include <vector> /* клас vector */
using namespace std ; /* друкуємо усе без std */
/* головна функція програми */
int main (int argc, char** argv)
{
/* створюємо примірники піддослідних векторів
** v1 для несортованої послідовності,
** а v2 для сортованої */
vector <int> v1, v2 ;
/* заповнюємо два вектори послідовностями чисел
** за допомогою функції resize */
v1.resize (2 , 10) ;
v1.resize (4 , 20) ;
v1.resize (6 , 50) ;
v1.resize (8 , 20) ;
v1.resize (10, 50) ;
v2.resize (2 , 10) ;
v2.resize (4 , 20) ;
v2.resize (6 , 30) ;
v2.resize (8 , 40) ;
v2.resize (10, 50) ;
/* виводимо вектори для наглядності у термінал */
for (vector<int>::iterator iter=v1.begin(); iter!=v1.end(); ++iter)
{ cout << *iter << "; " ; }
cout << endl ;
for (vector<int>::iterator iter=v2.begin(); iter!=v2.end(); ++iter)
{ cout << *iter << "; " ; }
cout << endl << endl ;
/* виконуємо скорочення участків з послідовностями
** еквівалентних елементів на двох векторах */
vector<int>::iterator rester1 = unique (v1.begin(), v1.end()) ;
vector<int>::iterator rester2 = unique (v2.begin(), v2.end()) ;
/* виводимо результат на екран */
for (vector<int>::iterator iter=v1.begin(); iter!=rester1; ++iter)
{ cout << *iter << "; " ; }
cout << endl ;
for (vector<int>::iterator iter=v2.begin(); iter!=rester2; ++iter)
{ cout << *iter << "; " ; }
cout << endl ;
return 0 ;
}
Вивід програми наступний:
Як бачимо перша, несортована послідовність, містить у собі не унікальні елементи 20, 50. А друга, сортована, мітстить тільки унікальні елементи, завдяки тому, що її дубльовані елементи були розміщені разом.