De vez em quando, você gostaria de realizar um mapa lispy oldschool em um std :: vector e obter um novo vetor como resultado. O problema é que std :: transform mudará seu vetor original se você não criar um vetor de saída explícito e passar seu iterador para std :: transform.
IMHO isso é um pouco trabalhoso demais para cada vez que você quer fazer um mapa simples () e então eu construí um pequeno invólucro …
#include <algorithm>
template <typename T, typename OP>
T map(const T& coll, OP lambda) {
T new_coll(coll.size());
std::transform(std::begin(coll),
std::end(coll),
std::begin(new_coll),
lambda);
return new_coll;
}
void testmap() {
std::vector<Float32> vec = {1.0, 2.0, 3.0};
//we could also use a [](const Type&) lambda here
auto vec2 = map(vec, [](Float32 f) -> Float32 {
return f * 2.0;
});
printf("orig data:t{");
for (auto f : vec) {
printf("%f, ", f);
}
printf("}n new data:t{");
for (auto f : vec2) {
printf("%f, ", f);
}
printf("}n");
}
O resultado será:
orig data: {1.000000, 2.000000, 3.000000, }
new data: {2.000000, 4.000000, 6.000000, }
Diverta-se 😉