Narzędzia użytkownika

Narzędzia witryny


unique_unique_copy

Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

Both sides previous revision Previous revision
Next revision
Previous revision
unique_unique_copy [2009/04/30 00:12]
pgrabowska
unique_unique_copy [2009/04/30 02:01] (aktualna)
pgrabowska
Linia 20: Linia 20:
 **unique ** to algorytm służący usuwaniu następujących po sobie duplikatów elementów z zakresu [ //​firstElement//​ , //​lastElement//​ ). //​firstElement//​ i //​lastElement//​ są iteratorami wskazującymi na pozycję w kontenerze ( np. lista, wektor ). Algorytm jest realizowany poprzez usuwanie wszystkich elementów identycznych z elementem bezpośrednio poprzedzającym. **unique ** to algorytm służący usuwaniu następujących po sobie duplikatów elementów z zakresu [ //​firstElement//​ , //​lastElement//​ ). //​firstElement//​ i //​lastElement//​ są iteratorami wskazującymi na pozycję w kontenerze ( np. lista, wektor ). Algorytm jest realizowany poprzez usuwanie wszystkich elementów identycznych z elementem bezpośrednio poprzedzającym.
  
-Porównywanie elementów odbywa się przy wykorzystaniu operatora ==. W przypadku, gdy nie jest zaimplementowany,​ należy podać jako trzeci argument ​funkcjęktóra ​porównuje elementy. ​Powinna ona zwracać //true// jeśli elementy są identyczne i //false// w przeciwnym przypadku.+Porównywanie elementów odbywa się przy wykorzystaniu operatora ==. W przypadku, gdy nie jest zaimplementowany,​ należy podać jako trzeci argument ​predykatktóry ​porównuje elementy. ​Powinien on zwracać //true// jeśli elementy są identyczne i //false// w przeciwnym przypadku.
  
 Zachowanie algorytmu jest następujące:​ Zachowanie algorytmu jest następujące:​
Linia 39: Linia 39:
 </​code>​ </​code>​
  
-==== Parametry====+==== Parametry ====
  
-  * //​firstElement,​ lastElement//​ - iteratory wskazujące zakres elementów na którym będzie realizowany algorytm. Zakres ten zawiera wszystkie elementy od firstElement do elementu poprzedzającego lastElement. +  * //​firstElement,​ lastElement//​ - iteratory wskazujące zakres elementów na którym będzie realizowany algorytm. Zakres ten zawiera wszystkie elementy od //firstElement// do elementu poprzedzającego ​//lastElement//
-  * //comp// - binarny predykat przyjmujący 2 elemety jako argumenty i zwracający true jeśli oba są równe i false w przeciwnym przypadku. Może to być zarówno wskaźnik na funkcję, jak i wskaźnik na obiekt klasy przeładowującej operator().+  * //comp// - binarny predykat przyjmujący 2 elemety jako argumenty i zwracający ​//true// jeśli oba są równe i //false// w przeciwnym przypadku. Może to być zarówno wskaźnik na funkcję, jak i wskaźnik na obiekt klasy przeciążającej //operator()//.
  
-==== Wartość zwracana====+==== Wartość zwracana ====
  
 Iterator wskazujący na nowy koniec sekwencji z zadanego zakresu, która nie zawiera już powtarzających się po sobie elementów. Iterator wskazujący na nowy koniec sekwencji z zadanego zakresu, która nie zawiera już powtarzających się po sobie elementów.
  
-==== Uwaga====+==== Uwaga ====
  
 Należy uwzględnić fakt, że algorytm **unique** nie zmienia wielkości kontenera, ani nie zmienia elementów położonych za nowym końcem ( ciągle są dostępne ). Należy uwzględnić fakt, że algorytm **unique** nie zmienia wielkości kontenera, ani nie zmienia elementów położonych za nowym końcem ( ciągle są dostępne ).
 +
 +==== Przykład ====
 +
 +<code cpp>
 +#include <​iostream>​
 +#include <​algorithm>​
 +#include <​vector>​
 +using namespace std;
 +
 +// implementacja funkcji porownujacej elementy
 +bool comp(int i, int j) 
 +{
 +  return (i==j);
 +}
 +
 +int main () 
 +{
 + // tworzy wektory z powtarzajacymi sie po sobie elementami
 + int myints[] = {10,​20,​20,​20,​30,​30,​20,​20,​10};​
 + vector<​int>​ myvector (myints,​myints+9);​ //​ 10 20 20 20 30 30 20 20 10
 + vector<​int>::​iterator it;
 +
 + // PRZYKLAD UZYCIA UNIQUE Z DOMYSLNYM OPERATOREM ==
 +
 + // użycie unique z domyslnym operatorem == 
 + it = unique (myvector.begin(),​ myvector.end());​ // 10 20 30 20 10 30 20 20 10
 +
 + // dostosowanie wielkosci myvector do zaktualizowanej liczby elementow
 + myvector.resize( it - myvector.begin() );       // 10 20 30 20 10
 +
 + // wypisanie zawartosci myvector
 +        // 10 20 30 20 10
 + cout << "​\nunique z domyslnym operatorem==\n";​
 + for (vector<​int>::​iterator iter=myvector.begin();​ iter!=myvector.end();​ ++iter)
 + cout << " " << *iter;
 +
 +
 + // PRZYKLAD UZYCIA UNIQUE ZE ZDEFINIOWANA FUNKCJA POROWNUJACA ELEMENTY
 + myvector.clear();​
 + myvector.insert(myvector.begin(),​ myints, myints + 9); // 10 20 20 20 30 30 20 20 10
 +
 + // uzycie unique ze zdediniowana funkcja porownujaca elementy
 + it = unique (myvector.begin(),​ myvector.end(),​ comp); ​  // 10 20 30 20 10 30 20 20 10
 +
 + // dostosowanie wielkosci myvector do zaktualizowanej liczby elementow
 + myvector.resize( it - myvector.begin() );       // 10 20 30 20 10
 +
 + // wypisanie zawartosci myvector
 +        // 10 20 30 20 10
 + cout << "​\n\nunique ze zdefiniowana funkcja porownujaca\n";​
 + for (vector<​int>::​iterator iter=myvector.begin();​ iter!=myvector.end();​ ++iter)
 + cout << " " << *iter;
 +
 + cout << endl;
 +
 + return 0;
 +}
 +</​code>​
 +
 +
 +
 +===== unique_copy =====
 +
 +<code cpp>
 +template <class InputIterator,​ class OutputIterator>​
 +  OutputIterator unique_copy ( InputIterator firstElement,​ InputIterator lastElement,​ OutputIterator result );
 +
 +template <class InputIterator,​ class OutputIterator,​ class BinaryPredicate>​
 +  OutputIterator unique_copy ( InputIterator firstElement,​ InputIterator firstElement,​ OutputIterator result, BinaryPredicate comp );
 +</​code>​
 +
 +**unique_copy** kopiuje wartości elementów z zakresu [ //​firstElement//,​ //​lastElement//​ ) do zakresu, którego początek wskazuje iterator //result//, za wyjątkiem ​ następujących po sobie duplikatów.
 +
 + ​Algorytm pomija elementy o wartościach identycznych z elementem bezpośrednio je poprzedzającym ( kopiowany jest zawsze tylko pierwszy element ze zbioru elementów identycznych ).
 +
 +Porównywanie elementów odbywa się przy wykorzystaniu operatora ==. W przypadku, gdy nie jest zaimplementowany,​ należy podać jako trzeci argument predykat, który porównuje elementy. Powinien on zwracać //true// jeśli elementy są identyczne i //false// w przeciwnym przypadku.
 +
 +Zachowanie algorytmu jest następujące:​
 +<code cpp>
 +template <class ForwardIterator>​
 +  ForwardIterator unique ( ForwardIterator firstElement,​ ForwardIterator lastElement )
 +{
 +  ForwardIterator result = first;
 +
 +  while ( ++first != last )
 +  {
 +    if ( !( *result == *first ) ) 
 +        *(++result)=*first;​
 +  }
 +
 +  return ++result;
 +}
 +</​code>​
 +
 +==== Parametry ====
 +  * //​firstElement,​ lastElement//​ - iteratory wskazujące zakres elementów na którym będzie realizowany algorytm. Zakres ten zawiera wszystkie elementy od //​firstElement//​ do elementu poprzedzającego //​lastElement//​.
 +  * //result// - iterator wskazujący początek zakresu, do którego ma być zapisana sekwencja elementów wyznaczona przez algorytm.
 +  * //comp// - binarny predykat przyjmujący 2 elemety jako argumenty i zwracający //true// jeśli oba są równe i //false// w przeciwnym przypadku. Może to być zarówno wskaźnik na funkcję, jak i wskaźnik na obiekt klasy przeciążającej //​operator()//​.
 +
 +==== Wartość zwracana ====
 +Iterator wskazujący na koniec skopiowanego zakresu.
 +
 +==== Przykład ====
 +
 +<code cpp>
 +#include <​iostream>​
 +#include <​algorithm>​
 +#include <​vector>​
 +using namespace std;
 +
 +// implementacja funkcji porownujacej elementy
 +bool comp(int i, int j) 
 +{
 +  return (i==j);
 +}
 +
 +int main () 
 +{
 + // tworzy wektory z powtarzajacymi sie po sobie elementami
 + int myints[] = {10,​20,​20,​20,​30,​30,​20,​20,​10};​
 + vector<​int>​ myvector (9); // 0 0 0 0 0 0 0 0 0
 + vector<​int>::​iterator it;
 +
 +
 + // użycie unique_copy z domyslnym operatorem == 
 + it=unique_copy (myints,​myints+9,​myvector.begin());​ // 10 20 30 20 10 0 0 0 0
 +
 + // sortowanie elementow
 + sort (myvector.begin(),​it);​ // 10 10 20 20 30 0 0 0 0
 +
 + // uzycie unique_copy ze zdediniowana funkcja porownujaca elementy
 + it=unique_copy (myvector.begin(),​ it, myvector.begin(),​ comp); // 10 20 30 20 30 0 0 0 0
 +
 + // dostosowanie wielkosci myvector1 do zaktualizowanej liczby elementow
 + myvector.resize( it - myvector.begin() ); // 10 20 30
 +
 + // wypisanie zawartosci
 +        // 10 20 30
 + for (vector<​int>::​iterator iter=myvector.begin();​ iter!=myvector.end();​ ++iter)
 + cout << " " << *iter;
 +
 + cout << endl;
 +
 + return 0;
 +}
 +</​code>​
 +
 +
 +===== Przykładowy program =====
 +{{:​stl_algorytmy:​unique_unique_copy.cpp|}}
 +
 +
 +
  
  
unique_unique_copy.1241043128.txt.gz · ostatnio zmienione: 2009/04/30 00:12 przez pgrabowska