我的问题很简单,参见示例:
std::array<int,6> a = {{0,1,2,3,4,5}}; // -- given container.
auto F = []( int i ) { return i*i; }; // -- given function.
std::vector<int> v; // need create
// my solution:
v.reserve( a.size () );
for( std::size_t i = 0; i < a.size(); ++i )
v.push_back( F(a[i]) );
// but I need something like
std::vector<int>v( a.begin(), a.end(), <|applying each element to F|> );
我可以创建像上面这样的容器,而不是显式调用预订和任何重新分配吗?
编辑:
发布于 2014-02-21 11:32:28
另一个解决方案是使用boost::transform_iterator
。好处是您可以将迭代器传递给容器构造函数。这避免了与使用std::back_inserter
或在目标上调用reserve
或resize
时相比的内存重新分配。所有这些都是在一份声明中:
std::vector<int> result(
boost::make_transform_iterator(std::begin(a), F)
, boost::make_transform_iterator(std::end(a), F)
);
不过,您可以实现更简洁的语法,如下所示:
std::vector<int> result(transform_range(a, F));
transform_range
实现:
template<class Iterator>
struct AutoSequence
{
Iterator const beg_, end_;
template<class T>
operator std::vector<T>() const {
return {beg_, end_};
}
};
template<class Function, class InSeq>
auto transform_range(InSeq const& in) -> AutoSequence<decltype(boost::make_transform_iterator<Function>(in.begin()))> {
return {
boost::make_transform_iterator<Function>(std::begin(in))
, boost::make_transform_iterator<Function>(std::end(in))
};
}
template<class Function, class InSeq>
auto transform_range(InSeq const& in, Function&& f) -> AutoSequence<decltype(boost::make_transform_iterator(in.begin(), f))> {
return {
boost::make_transform_iterator(std::begin(in), f)
, boost::make_transform_iterator(std::end(in), f)
};
}
发布于 2014-02-21 11:23:59
标准算法std::transform
正是这样做的!
std::vector<int> v(a.size());
std::transform(
std::begin(a), std::end(a),
std::begin(v),
F
);
如果您愿意,可以从空向量开始并使用std::back_inserter
:
std::vector<int> v;
std::transform(
std::begin(a), std::end(a),
std::back_inserter(v),
F
);
但是如果你这样做,你就会让自己受到不必要的重新分配(除非你先做reserve
,就像你最初的尝试一样)。你可以自己决定你的首要任务是什么。
发布于 2014-02-21 11:23:53
#include <algorithm> // std::transform
#include <iterator> // std::back_inserter
....
transform(a.begin(), a.end(), back_inserter(v), F);
您可能需要首先调用v.reserve(asize())
,以避免重新分配。
https://stackoverflow.com/questions/21943387
复制相似问题