Boost循环缓冲区push_back在前面插入数据

Pro*_*mer 2 c++ boost

我有以下代码:

#include "boost/circular_buffer.hpp"

int main()
{
    // Create a circular buffer with a capacity for 3 integers.
    boost::circular_buffer<int> cb(3);

    // Insert threee elements into the buffer.
    cb.push_back(1);


    int a = cb[0];  // a == 1

}
Run Code Online (Sandbox Code Playgroud)

根据文档,push_back API的意思是“在 circle_buffer 的末尾插入一个新元素” -那么cb [0]如何为1?cb [2]不应存储值1吗?

======================================更新=========== ===================

// Insert threee elements into the buffer.
cb.push_front(11);
cb.push_back(2);
cb.push_back(3);

int a = cb[0];  // a == 11
int b = cb[1];  // b == 2
int c = cb[2];  // c == 3
Run Code Online (Sandbox Code Playgroud)

看起来,如果缓冲区中有0个元素,它将占用第一个元素,但是如果缓冲区中有一个,则将其放在最后

Lig*_*ica 5

不可以。缓冲区可容纳三个元素,但只能包含一个。

当您进行第一个操作时push_back,您将推到一系列零元素的末尾。因此,新元素成为第一个。

如果您想在建筑上完全填满它,可以这样做!就像使用向量一样:

boost::circular_buffer<int> cb(3, 0);
Run Code Online (Sandbox Code Playgroud)

但后来,你的第一个push_back仍然改变cb[0],因为它是一个循环缓冲区!这意味着它装满后会缠绕到前面。cb[3]超出范围。没有cb[3]

  • @程序员很抱歉,我不知道该怎么解释。很简单 您从没有任何元素开始。然后添加一个元素。所以现在您有了一个要素。这是第一个元素,总共一个元素。 (2认同)

Max*_*Max 5

否,因为元素已插入缓冲区的末尾。

这是您的空缓冲区:

[ ] [ ] [ ]
Run Code Online (Sandbox Code Playgroud)

调用push_back(1)后看起来像这样:

[1] [ ] [ ]
Run Code Online (Sandbox Code Playgroud)

调用`push_back(2)之后,它看起来像这样:

[1] [2] [ ]
Run Code Online (Sandbox Code Playgroud)

因此,缓冲区的第一个单元格保留值1,第二个值2依此类推。

  • @Programmer-如果您对其中的内容了解不多,则文档不会引起混淆。它的确表示“该项目放在后面”,但这是概念性的。在内部,为了保持循环队列的完整性,正在发生许多事情。需要调整“ front”,更改“ begin()”,依此类推。因此,“ push_back”的最佳方法是仅覆盖“ front”元素,然后调整“ begin()”和` front()`。 (3认同)
  • 因为它将元素推到了后面,这就是我试图解释的。“back”不是指缓冲区中的最后一个单元,而是指第一个空闲单元,即所有占用单元中的最后一个 (2认同)
  • @Programmer与标准容器(如vector)使用的术语相同。因此,如果您(从书中)理解了这些内容,那么您就会明白这一点。基础保留内存与您已添加到容器的元素的“逻辑”集合不同。 (2认同)