【问题标题】:C++ Using allocator and initializer with boost circular bufferC++ 使用分配器和初始化器与提升循环缓冲区
【发布时间】:2017-04-21 13:24:59
【问题描述】:

我正在尝试弄清楚如何将以下构造函数用于 boost::circular_buffer:

circular_buffer(capacity_type buffer_capacity, size_type n, const_reference item, const allocator_type& alloc = allocator_type());

我有一个自定义类:

template<class T> class Custom
{
  public:

    Custom() :
      time(0.0)
    {}

    double time;
    T data_;
};

使用构造函数定义我的循环缓冲区,只占用一个容量:

boost::circular_buffer<Custom<T>> buffer(10);

我对分配器的工作不多,我想在构造时使用默认/空/零值初始化我的缓冲区,但似乎上面提到的构造函数是使用 boost::circular_buffer 的方法我不确定如何使用 boost 构造函数。如果它是一个普通的向量,我假设我可以执行以下操作:

int num_elements = 10;
Custom<T> custom;
std::vector<Custom<T>> buffer(10, custom);

我真的找不到任何具体的例子,所以任何帮助或指导都非常感谢。

【问题讨论】:

    标签: c++ c++11 boost allocator circular-buffer


    【解决方案1】:

    就像您的std::vector 调用中您没有为Custom 指定分配器并使用默认值一样,您可以对boost::circular_buffer 执行相同的操作。唯一的区别是boost::circular_buffer 有一个额外的参数,允许您同时设置缓冲区中默认构造对象的容量和数量。这意味着如果你想要一个完整的boost::circular_buffer,那么你会使用:

    int num_elements = 10;
    Custom<T> custom;
    boost::circular_buffer<Custom<T>> buffer(num_elements, num_elements, custom);
    

    这会给你一个boost::circular_buffer,容量为num_elements,其中有num_elements默认分配的对象。

    您还可以:

    boost::circular_buffer<Custom<T>> buffer(num_elements, num_elements/2, custom);
    

    将容量设置为num_elements,但仅使用默认分配的对象填充缓冲区的一半 (num_elements/2)。

    确实,您必须使用不同分配器的唯一原因是,如果您希望分配器使用与默认不同的分配方案(它在系统中实际分配内存的方式)。

    【讨论】:

    • 好的,这很棒。问题:现在当我向后推时,它将在最后开始填充,因为所有项目都已填充,并且我的尺寸将返回 num_elements。有没有办法解决?基本上我想要默认值,所以每当我访问尚未填充但仍在容量范围内的缓冲区 [索引] 时,它不会出错。但我有点想要空缓冲区的行为,其中 size 只返回我专门推回的项目,当我明确推回时,它会从头开始(忽略默认值)。不确定这是否可能,可能不得不重载一些运算符/方法?
    • @arias_JC 就像矢量一样,它不是一个就是另一个。您可以默认填充它并使用operator[] 覆盖,或者您设置它的容量并使用push_back() 填充它。您可以将缓冲区包装在您自己的类中,并提供您想要的功能,如果您真的必须拥有它。
    猜你喜欢
    • 1970-01-01
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    • 1970-01-01
    • 2019-04-25
    • 1970-01-01
    • 2021-12-23
    相关资源
    最近更新 更多