C++ Boost循环缓冲区push_back在前端插入数据

C++ Boost循环缓冲区push_back在前端插入数据,c++,boost,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 =

我有以下代码:

#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

}
如果一个缓冲区中有0个元素,它会占用第一个元素,但是如果相同的元素有一个元素,那么它会将其放在末尾。

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

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

如果您想在构建时完全填充它,就像使用向量一样:

boost::circular_buffer<int> cb(3, 0);
boost::循环缓冲区cb(3,0);

但是,您的第一次
向后推
仍然会改变
cb[0]
,因为它是一个循环缓冲区!这意味着它在满的时候会绕到前面<代码>cb[3]
超出范围。没有
cb[3]

no,因为元素是在缓冲区的末尾插入的

这是您的空缓冲区:

[ ] [ ] [ ]
调用
push_back(1)
后,如下所示:

[1] [ ] [ ]
[1] [2] [ ]
在调用“push_back”(2)之后,它看起来是这样的:

[1] [ ] [ ]
[1] [2] [ ]

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

谢谢-是的,最后一个索引将是2-cb[2]-但是,您可以简单地说“推到一系列零元素的末尾。因此新元素成为第一个。”?谢谢,我已根据我的理解更新了问题,并注意到了you@Programmer对不起,我不知道该怎么解释。这很简单。你从没有元素开始。然后添加一个元素。现在你有了一个元素。这是总共一个元素中的第一个元素。是的,似乎是这样——那么为什么API被称为push_back()?因为它将元素推到后面,这就是我试图解释的。”back“不是指缓冲区中的最后一个单元格,而是指第一个空闲单元格,这意味着根据输出,所有占用单元格中的最后一个,它匹配您所声明的内容,但“在循环缓冲区的末尾插入一个新元素。”-我同意您基于输出的陈述,但文档可能是confusing@Programmer这与vector等标准容器使用的术语相同。所以,如果你从书中理解了这些,那么你就理解了这一点。底层保留内存与您添加到容器中的元素的“逻辑”集合不同。@程序员——如果您不深入阅读文档,文档就不会混淆。它的意思是“物品放在后面”,但这是概念性的。在内部,为了保持循环队列的完整性,发生了多种事情。“前面”需要调整,
begin()
现在被更改,等等。因此,执行“向后推”的最佳方法是只覆盖“前面”的元素,然后调整
begin()
front()
。你想得太多了,弄糊涂了。
push_back
的行为是一致的,并不取决于要从多少个元素开始。它会在逻辑结尾处添加一个句点。我想你只是误解了“开始”和“结束”在这个上下文中的含义。