Lambdas and Callables
Transform With Lambda
std::transform can use a lambda to build changed values from an input range.
transform
`std::transform` applies a callable to each input value and writes the result to an output range.
Transform With Lambda
transform_with_lambda.cpp
Replay: real traced execution (multi-file project)
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
int scale = 3;
std::vector<int> values{1, 2, 4};
std::vector<int> scaled(values.size());
std::transform(values.begin(), values.end(), scaled.begin(), [scale](int value) {
return value * scale;
});
for (int value : scaled) {
std::cout << "scaled=" << value << std::endl;
}
return 0;
}
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
int scale = 2;
std::vector<int> values{1, 2, 4};
std::vector<int> scaled(values.size());
std::transform(values.begin(), values.end(), scaled.begin(), [scale](int value) {
return value * scale;
});
for (int value : scaled) {
std::cout << "scaled=" << value << std::endl;
}
return 0;
}
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
int scale = 5;
std::vector<int> values{1, 2, 4};
std::vector<int> scaled(values.size());
std::transform(values.begin(), values.end(), scaled.begin(), [scale](int value) {
return value * scale;
});
for (int value : scaled) {
std::cout << "scaled=" << value << std::endl;
}
return 0;
}
scale ← 3, values ← [1, 2, 4], scaled ← [0, 0, 0]
5int main() {6 int scale→ 3 = 3; //@scale=2, 578 std::vector<int> values→ [1, 2, 4]{1, 2, 4};9 std::vector<int> scaled→ [0, 0, 0](values[1, 2, 4].size());1011 std::transform(values[1, 2, 4].begin(), values.end(), scaled→ [3, 6, 12].begin(), [scale](int value) {12 return value * scale;13 });for (int value : scaled)
pass 1 of 315for (int value3 : scaled[3, 6, 12]) {16 std::cout << "scaled=" << value3 << std::endl;17}outputscaled=3All 3 passes — pass 1 is the card above pass value1 3 2 6 3 12 return 0;
19 return 0;20}
scale ← 2, values ← [1, 2, 4], scaled ← [0, 0, 0]
5int main() {6 int scale→ 2 = 2;78 std::vector<int> values→ [1, 2, 4]{1, 2, 4};9 std::vector<int> scaled→ [0, 0, 0](values[1, 2, 4].size());1011 std::transform(values[1, 2, 4].begin(), values.end(), scaled→ [2, 4, 8].begin(), [scale](int value) {12 return value * scale;13 });for (int value : scaled)
pass 1 of 315for (int value2 : scaled[2, 4, 8]) {16 std::cout << "scaled=" << value2 << std::endl;17}outputscaled=2All 3 passes — pass 1 is the card above pass value1 2 2 4 3 8 return 0;
19 return 0;20}
scale ← 5, values ← [1, 2, 4], scaled ← [0, 0, 0]
5int main() {6 int scale→ 5 = 5;78 std::vector<int> values→ [1, 2, 4]{1, 2, 4};9 std::vector<int> scaled→ [0, 0, 0](values[1, 2, 4].size());1011 std::transform(values[1, 2, 4].begin(), values.end(), scaled→ [5, 10, 20].begin(), [scale](int value) {12 return value * scale;13 });for (int value : scaled)
pass 1 of 315for (int value5 : scaled[5, 10, 20]) {16 std::cout << "scaled=" << value5 << std::endl;17}outputscaled=5All 3 passes — pass 1 is the card above pass value1 5 2 10 3 20 return 0;
19 return 0;20}