Iterator and Algorithm Patterns
Transform Values
std::transform creates derived values by applying the same operation to each input element.
transform
`std::transform` writes one output value for each input value.
output container
The output container must have room for the transformed values before the algorithm writes into it.
Transform Values
transform_values.cpp
Replay: real traced execution (multi-file project)
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
std::vector<int> base{2, 4, 6};
int multiplier = 3;
std::vector<int> scaled(base.size());
std::transform(base.begin(), base.end(), scaled.begin(),
[multiplier](int value) {
return value * multiplier;
});
std::cout << "multiplier=" << multiplier << std::endl;
std::cout << "scaled0=" << scaled[0] << std::endl;
std::cout << "scaled2=" << scaled[2] << std::endl;
return 0;
}
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
std::vector<int> base{2, 4, 6};
int multiplier = 2;
std::vector<int> scaled(base.size());
std::transform(base.begin(), base.end(), scaled.begin(),
[multiplier](int value) {
return value * multiplier;
});
std::cout << "multiplier=" << multiplier << std::endl;
std::cout << "scaled0=" << scaled[0] << std::endl;
std::cout << "scaled2=" << scaled[2] << std::endl;
return 0;
}
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
std::vector<int> base{2, 4, 6};
int multiplier = 5;
std::vector<int> scaled(base.size());
std::transform(base.begin(), base.end(), scaled.begin(),
[multiplier](int value) {
return value * multiplier;
});
std::cout << "multiplier=" << multiplier << std::endl;
std::cout << "scaled0=" << scaled[0] << std::endl;
std::cout << "scaled2=" << scaled[2] << std::endl;
return 0;
}
base ← [2, 4, 6], multiplier ← 3, scaled ← [0, 0, 0]
5int main() {6 std::vector<int> base→ [2, 4, 6]{2, 4, 6};7 int multiplier→ 3 = 3; //@multiplier=2, 589 std::vector<int> scaled→ [0, 0, 0](base[2, 4, 6].size());10 std::transform(base[2, 4, 6].begin(), base.end(), scaled→ [6, 12, 18].begin(),11 [multiplier](int value) {12 return value * multiplier;13 });1415 std::cout << "multiplier=" << multiplier3 << std::endl;16 std::cout << "scaled0=" << scaled[6, 12, 18][0] << std::endl;17 std::cout << "scaled2=" << scaled[6, 12, 18][2] << std::endl;18 return 0;19}outputmultiplier=3 scaled0=6 scaled2=18
base ← [2, 4, 6], multiplier ← 2, scaled ← [0, 0, 0]
5int main() {6 std::vector<int> base→ [2, 4, 6]{2, 4, 6};7 int multiplier→ 2 = 2;89 std::vector<int> scaled→ [0, 0, 0](base[2, 4, 6].size());10 std::transform(base[2, 4, 6].begin(), base.end(), scaled→ [4, 8, 12].begin(),11 [multiplier](int value) {12 return value * multiplier;13 });1415 std::cout << "multiplier=" << multiplier2 << std::endl;16 std::cout << "scaled0=" << scaled[4, 8, 12][0] << std::endl;17 std::cout << "scaled2=" << scaled[4, 8, 12][2] << std::endl;18 return 0;19}outputmultiplier=2 scaled0=4 scaled2=12
base ← [2, 4, 6], multiplier ← 5, scaled ← [0, 0, 0]
5int main() {6 std::vector<int> base→ [2, 4, 6]{2, 4, 6};7 int multiplier→ 5 = 5;89 std::vector<int> scaled→ [0, 0, 0](base[2, 4, 6].size());10 std::transform(base[2, 4, 6].begin(), base.end(), scaled→ [10, 20, 30].begin(),11 [multiplier](int value) {12 return value * multiplier;13 });1415 std::cout << "multiplier=" << multiplier5 << std::endl;16 std::cout << "scaled0=" << scaled[10, 20, 30][0] << std::endl;17 std::cout << "scaled2=" << scaled[10, 20, 30][2] << std::endl;18 return 0;19}outputmultiplier=5 scaled0=10 scaled2=30