Composability de algoritmos STL
Os algoritmos STL são uma coisa bastante útil em C ++. Mas uma coisa que me irrita é que eles parecem não ter compostabilidad
Por exemplo, digamos que eu tenho umvector<pair<int, int>>
e quer transformar isso em umvector<int>
contendo apenas osecond
membro do par. Isso é bastante simples:
std::vector<std::pair<int, int>> values = GetValues();
std::vector<int> result;
std::transform(values.begin(), values.end(), std::back_inserter(result),
[] (std::pair<int, int> p) { return p.second; });
Ou talvez eu queira filtrar ovector
apenas para os pares cujosfirst
member é par. Também é bem simples:
std::vector<std::pair<int, int>> values = GetValues();
std::vector<std::pair<int, int>> result;
std::copy_if(values.begin(), values.end(), std::back_inserter(result),
[] (std::pair<int, int> p) { return (p.first % 2) == 0; });
Mas e se eu quiser fazer as duas coisas? Não hátransform_if
algoritmo e usando os doistransform
ecopy_if
parece exigir a alocação temporária devector
para manter o resultado intermediário:
std::vector<std::pair<int, int>> values = GetValues();
std::vector<std::pair<int, int>> temp;
std::vector<int> result;
std::copy_if(values.begin(), values.end(), std::back_inserter(temp),
[] (std::pair<int, int> p) { return (p.first % 2) == 0; });
std::transform(values.begin(), values.end(), std::back_inserter(result),
[] (std::pair<int, int> p) { return p.second; });
Isso parece um desperdício para mim. A única maneira de pensar em evitar o vetor temporário é abandonartransform
ecopy_if
e simplesmente usefor_each
(ou um loop for regular, conforme o que você gosta):
std::vector<std::pair<int, int>> values = GetValues();
std::vector<int> result;
std::for_each(values.begin(), values.end(),
[&result] (std::pair<int, int> p)
{ if( (p.first % 2) == 0 ) result.push_back(p.second); });
Estou faltando alguma coisa aqui? Existe uma boa maneira de compor dois algoritmos STL existentes em um novo sem precisar de armazenamento temporário?