mapa funcional imutável em C ++ 11

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 😉