Поделиться через


unique (<algorithm>)

Удаляет повторяющиеся элементы, рядом с друг с другом в указанном диапазоне.

template<class ForwardIterator>
   ForwardIterator unique(
      ForwardIterator _First, 
      ForwardIterator _Last
   );
template<class ForwardIterator, class Predicate>
   ForwardIterator unique(
      ForwardIterator _First, 
      ForwardIterator _Last,
      Predicate _Comp
   );

Параметры

  • _First
    Передний итератор слишком позицию первого элемента в диапазоне, поддерживает для удаления повторяющихся результатов.

  • _Last
    Передний итератор слишком положение за одно окончательное элементом в диапазоне, поддерживает для удаления повторяющихся результатов.

  • _Comp
    Определяемый пользователем объект функции предиката, который определяет условия, которые должны удовлетворять case 2 элемента, которое необходимо выполнить как эквивалента. Двоичный предикат принимает два аргумента и возвращает true , если он удовлетворяется, и false, если не удовлетворяется.

Возвращаемое значение

Передний итератор в новый конец измененной последовательности, которая не содержит последовательные дубликаты, обращаясь позиция одно за последним не удаленным элементом.

Заметки

Обе формы алгоритма удаляет второй дубликат последовательной пары равных элементов.

Операция алгоритма стабилизирована так, что не будет изменен относительный порядок не вычеркнутых элементов.

Указанный диапазон должен быть допустимым; все указатели должны быть dereferenceable и внутри последовательности последнего положения доступен из первого инкрементацией. это число элементов в последовательности не изменяется алгоритмом unique и элементы за пределы измененной последовательности dereferenceable, но не определены.

Сложность линейная, без (_Last — _First) — 1 сравнений.

Список содержит более эффективный функции-члена unique, который может выполняться эффективнее.

Эти алгоритмы нельзя использовать в ассоциативном контейнер.

Пример

// alg_unique.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <functional>
#include <iostream>
#include <ostream>

using namespace std;

// Return whether modulus of elem1 is equal to modulus of elem2
bool mod_equal ( int elem1, int elem2 )
{
   if ( elem1 < 0 ) 
      elem1 = - elem1;
   if ( elem2 < 0 ) 
      elem2 = - elem2;
   return elem1 == elem2;
};

int main( )
{
   vector <int> v1;
   vector <int>::iterator v1_Iter1, v1_Iter2, v1_Iter3,
         v1_NewEnd1, v1_NewEnd2, v1_NewEnd3;

   int i;
   for ( i = 0 ; i <= 3 ; i++ )
   {
      v1.push_back( 5 );
      v1.push_back( -5 );
   }

   int ii;
   for ( ii = 0 ; ii <= 3 ; ii++ )
   {
      v1.push_back( 4 );
   }
   v1.push_back( 7 );
   
   cout << "Vector v1 is ( " ;
   for ( v1_Iter1 = v1.begin( ) ; v1_Iter1 != v1.end( ) ; v1_Iter1++ )
      cout << *v1_Iter1 << " ";
   cout << ")." << endl;

   // Remove consecutive duplicates
   v1_NewEnd1 = unique ( v1.begin ( ) , v1.end ( ) );

   cout << "Removing adjacent duplicates from vector v1 gives\n ( " ;
   for ( v1_Iter1 = v1.begin( ) ; v1_Iter1 != v1_NewEnd1 ; v1_Iter1++ )
      cout << *v1_Iter1 << " ";
   cout << ")." << endl;

   // Remove consecutive duplicates under the binary prediate mod_equals
   v1_NewEnd2 = unique ( v1.begin ( ) , v1_NewEnd1 , mod_equal );

   cout << "Removing adjacent duplicates from vector v1 under the\n "
        << " binary predicate mod_equal gives\n ( " ;
   for ( v1_Iter2 = v1.begin( ) ; v1_Iter2 != v1_NewEnd2 ; v1_Iter2++ )
      cout << *v1_Iter2 << " ";
   cout << ")." << endl;

   // Remove elements if preceded by an element that was greater
   v1_NewEnd3 = unique ( v1.begin ( ) , v1_NewEnd2, greater<int>( ) );

   cout << "Removing adjacent elements satisfying the binary\n "
        << " predicate mod_equal from vector v1 gives ( " ;
   for ( v1_Iter3 = v1.begin( ) ; v1_Iter3 != v1_NewEnd3 ; v1_Iter3++ )
      cout << *v1_Iter3 << " ";
   cout << ")." << endl;
}
  

Требования

Заголовок: <algorithm>

Пространство имен: std

См. также

Ссылки

Библиотека стандартных шаблонов