c++ - 从变换范围构造新容器

标签 c++ boost boost-range

在我的代码中,我经常需要从之前转换的范围创建一个新容器。到目前为止,我使用了 boost::adaptors::transformedboost::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::adaptors::transformed。文档声明 input 范围必须至少是 SinlgePassRange,但也说:

  • 返回范围类别:rng的范围类别。

因此,如果输入范围是随机访问的,那么输出范围也将是。这消除了您的担忧。

关于c++ - 从变换范围构造新容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51513302/

相关文章:

c++ - C++中的模板是什么

c++ - 动画 glutWireSphere

c++ - Release模式下的 OpenCV 堆损坏

c++ - 如何区分两个 boost::property_tree?

c++ - 将 STL 容器与 boost 范围适配器一起使用时出现 value_type 错误

c++ - boost Range 库会成为下一个 C++ 标准的一部分吗?

c++ - 实例化一个模板类,该模板类在具有不同函数签名的构造函数中采用函数指针

C++将取消引用的对象推送到 vector

c++ - 循环文件写入的磁盘 IO 问题

c++ - 将 Boost 适配器与 std::bind 表达式一起使用