====== Algorytm transform ====== Transform jest algorytmem służącym do wykonywania operacji na obiektach należących do danego zakresu. Pod tą nazwą kryją się dwie wersje funkcji: działająca na jednym zakresie danych wejściowych i działająca na dwóch zakresach. Transform zapisuje wynik operacji na kolejnych elementach do wskazanego zakresu wyjściowego. Transform jest stosowany do usprawnienia modyfikacji elementów kontenerów, w szczególności różnorodnych konwersji. Jego stosowanie poprawia czytelność kodu wskazując jasno jakie zakresy danych stanowią argumenty, a jakie zakresy elementów ulegają modyfikacji. ===== Deklaracja ===== W pliku nagłówkowym algorithm template OutputIterator transform(InputIterator first1, InputIterator last1, OutputIterator result, UnaryFunction op); template OutputIterator transform(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, OutputIterator result, BinaryFunction op); ===== Parametry ===== * **first1, last1** - Iteratory wskazujące na zakres danych wejściowych. Przetwarzaniu podlegają elementy z zakresu [first1, last1), co oznacza, że element wskazywany przez last1 nie zostanie przetworzony. * **first2** - W wersji transform dla operacji binarnej, iterator na początek drugiego zakresu danych wejściowych. Koniec tego zakresu jest wyliczany na podstawie długości zakresu [first1, last1). Należy więc zadbać, aby za elementem first2 istniało jeszcze co najmniej tyle elementów, ile jest pomiędzy first1 i last1. * **result** - Iterator na pierwszy element zakresu wyjściowego. Koniec zakresu jest wyliczany tak samo jak w przypadku drugiego zakresu danych wejściowych. Należy zadbać, aby było zapewnione miejsce na wszystkie wyniki, czyli aby za elementem result istniało jeszcze co najmniej tyle elementów ile jest pomiędzy first1 i last1. * **op** - operacja wykonywana na elementach. Musi przyjmować 1 albo 2 (zależnie od wywoływanej wersji) argumenty odpowiednich typów i zwracać obiekt typu odpowiadającego elementowi wskazywanemu przez iterator result. ===== Zwracana wartość ===== Iterator na kolejny element za ostatnim ze zmodyfikowanych przez algorytm (należy on do tej samej sekwencji co iterator result) ===== Ograniczenia ===== * Funkcja op powinna być pozbawiona efektów ubocznych. * Poprawność wykonania nie może zależeć od kolejności wywoływania operacji dla poszczególnych elementów. W szczególności result nie może należeć do zakresu [first1 + 1, last1) lub analogicznego [first2 + 1, first2+ last1-first1). Nic jednak nie stoi na przeszkodzie, aby result był równy first1 lub first2 (wtedy algorytm wykonuje transformację //w miejscu//) W przypadku potrzeby użycia algorytmu pozbawionego tych ograniczeń należy stosować algorytm [[for_each]] ===== Złożoność ===== Liniowa: wywołuje funkcję op i dokonuje przyporządkowania zwracanej przez nią wartości co najwyżej tylokrotnie, ile jest elementów w zakresie [first1, last1)