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?

questionAnswers(4)

yourAnswerToTheQuestion