Boost logo

Boost Users :

Subject: Re: [Boost-users] circular_buffer: rotate() vs erase_begin() for scalars
From: Maarten de Vries (maarten_at_[hidden])
Date: 2017-01-25 05:37:49


On 24 January 2017 at 16:28, Robert Dailey <rcdailey.lists_at_[hidden]> wrote:

> On Wed, Jan 18, 2017 at 12:00 PM, Robert Dailey
> <rcdailey.lists_at_[hidden]> wrote:
> > I'm using circular_buffer to represent a FIFO queue of bytes:
> >
> > boost::circular_buffer<std::uint8_t> m_queue;
> >
> > When I read bytes from the "front", I simply do:
> >
> > m_queue.erase_begin(num_read_bytes);
> >
> > I do so because the documentation for erase_begin() specifically
> > mentions constant time performance for scalar types since no
> > destructor needs to be called.
> >
> > However, I feel that rotate() better expresses what I'm trying to do.
> > Is there a reason to prefer one over the other for scalar types?
>
> Would it be possible to get some feedback on this?
>

​It sounds to me that what you want is erase_begin(). Rotate does not
remove the ​
​read bytes​ but puts them at the end of the sequence. It seems unlikely
that that is what you want.

That said, rotate is not guaranteed to be constant time. If the circular
buffer is not full it has to move elements around. The exact time
complexity can be found in the documentation. Look for "complexity" at
http://www.boost.org/doc/libs/1_63_0/doc/html/boost/circular_buffer.html#idp47282880-bb
.

Kind regards,
Maarten de Vries



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net