【问题标题】:Boost Circular Buffer push_back inserts data at frontBoost Circular Buffer push_back 在前面插入数据
【发布时间】:2021-10-26 03:15:42
【问题描述】:

我有以下代码:

#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

}

根据文档 push_back API 的意思是 “在循环缓冲区的末尾插入一个新元素” - 那么 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

似乎如果缓冲区中有 0 个元素,它会占用第一个元素,但如果有一个元素,则将其放在最后

【问题讨论】:

  • 你想太多了。 push_back 的行为是一致的,并不取决于有多少元素开始。它在逻辑结尾加一,句号。我认为您只是误解了“开始”和“结束”在这种情况下的含义。

标签: c++ boost


【解决方案1】:

没有。缓冲区有 容量 三个元素,但只包含一个。

当您执行您的第一个push_back 时,您将推到一系列零元素的末尾。所以新元素成为第一个。

如果您想在构建时将其完全填满,you can do that! 就像使用矢量一样:

boost::circular_buffer<int> cb(3, 0);

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

【讨论】:

  • 谢谢 - 是的最后一个索引将是 2 - cb[2] - 但是你能解释一下“推到一系列零元素的末尾。所以新元素成为第一个。”?
  • 谢谢,我已根据我的理解更新了问题,并注意到您提到的行为
  • @Programmer 对不起,我不知道该怎么解释。这很简单。你从没有元素开始。然后添加一个元素。所以现在你有了一个元素。这是第一个元素,总共有一个元素。
【解决方案2】:

不,因为元素被插入到缓冲区的末尾。

这是你的空缓冲区:

[ ] [ ] [ ]

调用push_back(1) 之后是这样的:

[1] [ ] [ ]

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

[1] [2] [ ]

【讨论】:

  • 是的,情况似乎如此——那么为什么 API 被称为 push_back()?
  • 因为它把元素推到后面,这就是我想要解释的。 'back' 不是指缓冲区中的最后一个单元格,而是指第一个空闲单元格,即所有占用的单元格中的最后一个
  • 是的,根据输出,它与您声明的内容相匹配-但是-boost.org/doc/libs/1_61_0/doc/html/boost/… 声明-“在循环缓冲区的末尾插入一个新元素。”-我同意您根据输出声明的内容,但是文档可能令人困惑
  • @Programmer 这与向量等标准容器使用的术语相同。因此,如果您了解这些(从您的书中),那么您就会明白这一点。底层保留内存与您添加到容器中的元素的“逻辑”集合不同。
  • @Programmer -- 如果您不仔细阅读该文档,它不会让人感到困惑。它确实意味着“物品放在后面”,但这是概念性的。在内部,为了保持循环队列的完整性,正在发生多种事情。 “front”需要调整,begin() 现在已更改,等等。所以执行“push_back”的最佳方法是仅覆盖“front”元素并调整begin()front()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-26
  • 2013-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多