Różnice między wybraną wersją a wersją aktualną.
Both sides previous revision Previous revision | Next revision Both sides next revision | ||
unique_unique_copy [2009/04/30 00:23] pgrabowska kosmetyka |
unique_unique_copy [2009/04/30 00:48] pgrabowska uzupelnienie |
||
---|---|---|---|
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 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: | Zachowanie algorytmu jest następujące: | ||
Linia 41: | Linia 41: | ||
==== 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 przeciążają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 ==== | ||
Linia 51: | Linia 51: | ||
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 ). | ||
+ | |||
+ | ===== 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. | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||