好吧,我们可以从这个开始:
template<typename Output, typename Input, typename Transformation>
auto transform( Input const& input, Transformation t )->Output {
Output retval;
retval.reserve(input.size());
using std::cbegin; using std::cend;
std::transform(cbegin(input), cend(input), std::back_inserter(retval));
return retval;
}
然后做这样的事情:
namespace aux{
using std::cbegin;
template<typename T>
auto adl_cbegin( T&& t )->decltype(cbegin(std::forward(t)));
}
template<typename Input, typename Transformation>
auto transform_vec( Input const& input, Transformation t )->
std::vector<typename std::remove_ref<decltype(t(*adl_cbegin(input)))>::type>
{
typedef std::vector<typename std::remove_ref<decltype(t(*adl_cbegin(input)))>::type> Output;
Output retval;
// retval.reserve(input.size()); -- need a way to do this if Input has an easy way to get size. Too lazy to bother right now.
using std::cbegin; using std::cend;
std::transform(cbegin(input), cend(input), std::back_inserter(retval));
return retval;
}
注意:这需要任何可迭代的东西(向量、数组、迭代器对)并生成 a 并从那里升级到在输入范围上生成 a std::pair
of boost::transform_iterator
,因此我们可以将生成的转换插入任意容器中,我们只做如果我们实际上取消引用迭代器,则转换工作。
或者,你知道,直接使用std::back_inserter(input)
。:) 这种方法的缺点是它不做储备,所以会影响性能。