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
的行为是一致的,并不取决于要从多少个元素开始。它会在逻辑结尾处添加一个句点。我想你只是误解了“开始”和“结束”在这个上下文中的含义。