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 <class InputIterator, class OutputIterator, class UnaryFunction>
OutputIterator transform(InputIterator first1, InputIterator last1,
OutputIterator result, UnaryFunction op);
template <class InputIterator1, class InputIterator2, class OutputIterator, class BinaryFunction>
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)