这里有一个transform_if
模板采用常用的输入迭代器对、输出迭代器和谓词以及转换函数对象。
template <class InputIt, class OutputIt, class Pred, class Fct>
void transform_if(InputIt first, InputIt last, OutputIt dest, Pred pred, Fct transform)
{
while (first != last) {
if (pred(*first))
*dest++ = transform(*first);
++first;
}
}
您可以将其用于您的示例,如下所示。
transform_if(myIntVector.cbegin(), myIntVector.cend(),
std::back_inserter(myStringVectorOfOdd),
[](int n){ return n % 2 != 0; },
[](int n){ return std::to_string(n); });
它不是超级简洁,但是过滤和转换被很好地分成了无捕获的 lambda,并且算法本身惯用地适用于迭代器。
由于范围库为组合算法提供了更好的支持,这里基于升压范围 https://www.boost.org/doc/libs/1_67_0/libs/range/doc/html/index.html:
#include <boost/range/algorithm.hpp>
#include <boost/range/adaptors.hpp>
using boost::adaptors::filtered;
boost::transform(myIntVector | filtered([](int n){ return n % 2 != 0; }),
std::back_inserter(myStringVectorOfOdd), [](int n){ return std::to_string(n); });