Sdílet prostřednictvím


unique (<algorithm>)

Odstraní duplicitní prvky, které jsou vedle sebe v dané oblasti.

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

Parametry

  • _First
    Vpřed iterace pozici první prvek v rozsahu mají být prohledány pro odstranění duplicitních adres.

  • _Last
    Vpřed iterace pozici jeden za poslední prvek v rozsahu mají být prohledány pro odstranění duplicitních adres.

  • _Comp
    Objekt predikátu funkce definované uživatelem, který definuje podmínky splněné, jestliže jsou dva prvky mají být přijata jako rovnocenný.Binární predikát přijímá dva argumenty a vrátí hodnotu true, když vyhovují, a hodnotu false, pokud nevyhovují.

Vrácená hodnota

Přední iterátor nový konec upravené posloupnost, která obsahuje žádné duplicitní po sobě jdoucích adresování jednu pozici za poslední prvek není odebrán.

Poznámky

Obě formy algoritmus odeberte druhý duplicitní po sobě následující dvojice stejné prvky.

Operace algoritmu je stabilní tak, že se nezmění relativní pořadí prvků obnovena.

Uváděný rozsah musí být platná. všechny ukazatele musí být dereferenceable a v pořadí je dostupná z první na poslední pozici ve incrementation. že počet prvků v pořadí nezmění algoritmem jedinečný a po skončení modifikované sekvence elementy jsou dereferenceable, ale není zadán.

Složitost je lineární, které vyžadují (_Last - _First) – 1 porovnání.

Seznam poskytuje efektivnější členskou funkci jedinečný, může fungovat rychleji.

Asociativní kontejneru nelze použít tyto algoritmy.

Příklad

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

Požadavky

Záhlaví: <algoritmus>

Obor názvů: std

Viz také

Referenční dokumentace

Standardní knihovna šablon