从转换后的范围构建新容器
Construct new container from transformed range
在我的代码中,我经常需要从以前转换的范围中创建一个新容器。到目前为止,我已经使用了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);
}));
所以我的问题是:从一个转换的范围构建一个新容器的最佳通用方法是什么?
您可以使用boost::adapter::transformed。文档规定输入范围必须至少为SinlgePassRange,但也说明:
- 返回范围类别:rng的范围类别
SO如果输入范围是随机访问,则输出范围也是。这消除了你的担忧。
std::transform是C++11及以上版本中的方法:
std::set<int> ints = {1,2,3,1};
std::vector<std::string> strings;
std::transform(ints.begin(), ints.end(), std::back_inserter(strings), [] (int i) {
return std::to_string(i)});
使用此选项,您只能将变换应用于给定范围内的每个元素。如果您还想进行一些过滤,可以使用std::copy_If。我建议你仔细研究一下标题,它充满了宝石。
编辑:添加了back_inserter
相关文章:
- 为什么构建目录中新构建的共享库与安装目录中的副本具有不同的依赖项集?
- 如果我真的真的想从 STL 容器继承,并且我继承构造函数并删除新运算符,会发生什么?
- 无法在 docker 容器中构建 qtpdf
- 我们是否能够在 C++20 中构建具有视图的容器?
- 插入容器的容器(如果是新的或附加到现有容器)
- 使用 task_group 的英特尔线程构建模块性能不佳(新用户)
- C++使用较新的编译器构建应用程序,而无需重新构建库
- 从转换后的范围构建新容器
- MXE Qt5 应用程序构建在 Docker 容器中失败
- 如何以链式方式在两个容器上构建迭代器
- 每次都构建(make)lib,只有在lib较新时才重新编译项目
- cpp 中是否存在一种数据结构,可以轻松地提供一种基于已存在的实例构建新结构的方法
- 如何避免构建新字符串
- 如何从一组已定义的描述符动态构建新的 protobuf
- 循环访问双端并将值推送到新容器中
- 如何在QT中构建新的扩展坞
- 在构建新库时包括库中的头文件
- 每次都重用容器或声明一个新容器
- 为从其模板成员函数的调用中已知的类型创建新容器的类
- 在构建新迭代时终止上一个迭代