在我的代码中,我经常需要从之前转换的范围创建一个新容器。到目前为止,我已经使用boost::adaptors::transformed
和的组合boost::copy_range
来完成这项工作,认为容器的构造函数应该能够预先分配必要的内存。不幸的是,我注意到它boost::adaptors::transform
返回一个 SinglePassRange 并且我不确定范围的大小是否可以在恒定时间内确定。
namespace boost {
template <typename SeqT, typename Range>
inline SeqT copy_range(const Range& r)
{
return SeqT(boost::begin(r), boost::end(r));
}
}
auto ints = std::vector<int>{...};
auto strings = boost::copy_range<std::vector<std::string>>(
boost::adaptors::transform(ints, [](auto val) {
return std::to_string(val);
}));
所以我的问题是:理想情况下,从转换范围构造一个新容器的最佳通用方法是一个表达式?