好了,我們可以用這樣開始:
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;
}
注:這需要什麼迭代(向量,數組,迭代器對)並生成一個 ,然後從那裏升級到在輸入範圍內生成std::pair
,boost::transform_iterator
,因此我們可以將生成的轉換插入到任意容器中,並且我們只進行轉換工作如果我們實際上取消引用迭代器。
或者,您知道,直接使用std::back_inserter(input)
即可。 :)這種方法的缺點是它沒有做保留,所以有性能點擊。
你見過['boost :: transform_iterator'](http://www.boost.org/libs/iterator/doc/transform_iterator.html)嗎? (而你的'impl'是函數聲明,而不是對象。) – ildjarn
'std :: vector impl();'應該可能是'std :: vector impl;' –
最後兩行*?或者最後兩個*聲明*? –