(C++) std::transform
January 11, 2018 · View on GitHub
(C++) std::transform
std::transform is an algorithm to perform a modifying function on the elements of a sequence (on a std::vector, for example). Use std::for_each to perform non-modifying functions on the elements of a sequence.
Prefer algorithms over hand-written loops [0][1][2]. View Exercise #9: No for-loops to learn how to remove hand-written loops .
std::transform does not use a predicate. Use Transform_if if a predicate is needed.
Example
The code below shows a simple way to multiply all elements in a std::vector by a certain value:
#include <vector> void Multiply(std::vector<int>& v, const int x) { const int sz = static_cast<int>(v.size()); for (int i=0; i!=sz; ++i) { v[i]*=x; } }
std::transform can be used to replace the for-loop in the example below:
#include <algorithm> #include <numeric> #include <vector> void Multiply(std::vector<int>& v, const int x) { std::transform(v.begin(),v.end(),v.begin(), std::bind2nd(std::multiplies<int>(),x)); }
std::transform function definition
Simplified from the STL that ships with C++ Builder 6.0:
template < class InputIter, class OutputIter, class UnaryOperation > OutputIter transform( InputIter first, InputIter last, OutputIter result, UnaryOperation opr ) { for ( ; first != last; ++first, ++result) *result = opr(*first); return result; } template < class InputIter1, class InputIter2, class OutputIter, class BinaryOperation > OutputIter transform( InputIter1 first1, InputIter1 last1, InputIter2 first2, OutputIter result, BinaryOperation binary_op ) { for ( ; first1 != last1; ++first1, ++first2, ++result) *result = binary_op(*first1, *first2); return result; }
std::transform does not use a predicate. Use Transform_if if a predicate is needed.
References
- [0] Bjarne Stroustrup. The C++ Programming Language (3rd edition). ISBN: 0-201-88954-4. Chapter 18.12.1 : 'Prefer algorithms over loops'
- [1] Herb Sutter and Andrei Alexandrescu. C++ coding standards: 101 rules, guidelines, and best practices. ISBN: 0-32-111358-6. Chapter 84: 'Prefer algorithm calls to handwritten loops.'
- [2] Herb Sutter and Andrei Alexandrescu. C++ coding standards: 101 rules, guidelines, and best practices. ISBN: 0-32-111358-6. Chapter 88: 'Prefer function objects over functions as algorithm and comparer arguments.'