C++ 如何辨别当前的';写入位置';一个Boost循环缓冲区,用于访问以前存储的值

C++ 如何辨别当前的';写入位置';一个Boost循环缓冲区,用于访问以前存储的值,c++,boost,circular-buffer,C++,Boost,Circular Buffer,我想访问Boost循环缓冲区中的一个值,例如,5个位置“过去”。因此,假设我现在将值“7”写入前面的整数流: 3,5,6,9,2,8,6 因此,我现在: 7,3,5,6,9,2,8,6 我想要“2”,因为过去是5个位置。我怎么知道 换句话说,当前的“写入索引”是什么 我想我可能需要使用boost::circular\u buffer::const\u iterator,但我不确定。我认为唯一可行的答案是你自己跟踪索引。根据Boost文档,容器似乎具有固定的分配大小,其工作方式类似于堆栈 与其他容

我想访问
Boost循环缓冲区中的一个值,例如,5个位置“过去”。因此,假设我现在将值“7”写入前面的整数流:

3,5,6,9,2,8,6

因此,我现在:

7,3,5,6,9,2,8,6

我想要“2”,因为过去是5个位置。我怎么知道

换句话说,当前的“写入索引”是什么


我想我可能需要使用
boost::circular\u buffer::const\u iterator
,但我不确定。

我认为唯一可行的答案是你自己跟踪索引。根据Boost文档,容器似乎具有固定的分配大小,其工作方式类似于堆栈

与其他容器一样,元素本质上并不跟踪其键。因此,由您在外部跟踪任何属性,如位置或关键点。您似乎只有常见的
std::vector
类函数可用:
size()
capacity()
at()
操作符[]
,等等,包括迭代器函数


我想你能做的最好的事情就是找到某种方法来跟踪“键”或索引号。由于循环缓冲区只是在“溢出”时循环并重写第一个数组,也许您可以使用模函数自己计数。

我不确定我是否理解正确,但您对模索引的担忧似乎让我过于焦虑。循环缓冲区抽象的全部目的是向调用者隐藏索引算法,如果你问我的话

如果Boost让这个实现细节泄露出去,我会对库的设计彻底失望

下面是一个简单的演示,似乎正是您想要的:

#include <iostream>
#include <boost/circular_buffer.hpp>

int main() {
    boost::circular_buffer<int> cb(10); // [tag:cb-so-fixedsize] obviously

    for (int msg : { 3, 5, 6, 9, 2, 8, 6, 7 }) {
        cb.push_back(msg);
    }

    // should be 2
    std::cout << "t0-5: " << cb[4] << "\n";
    std::cout << "t0-5: " << *std::next(cb.begin(), 4) << "\n";

    // should be 9
    std::cout << "t0-5: " << cb[3] << "\n";
    std::cout << "t0-5: " << *std::next(cb.begin(), 3) << "\n";

    while (!cb.empty()) {
        std::cout << cb.front() << " ";
        cb.pop_front();
    }
}

我很清楚“通告”这个名称暗示了实施细节,但是嘿。标准库和类似库中的许多数据结构都有一些稍微令人困惑的名称

你的意思是像
cb[cb.size()-5]
?@Barry好吧,我希望这能奏效。如果size给出的是当前的“size”模容量,并且与容量不同,这听起来是合乎逻辑的,因为缓冲区可能已经满了-如果这有意义的话?大小和容量只在循环缓冲区的第一个周期不同,否则就这么简单了。谢谢!这个项目使用C++ 98,所以我不能做STD::但是实际上我需要一些类似于<代码> *STD::PREV(Cb.Enter()),4)<代码>。如果我能做到这一点,那么我会接受你的答案,你的想法很好,如果我找不到更简单的解决方案,这将是我的下一步行动。然而,sehe给我指出了一个使用
boost::prior
的解决方案。谢谢
t0-5: 2
t0-5: 2
t0-5: 9
t0-5: 9
3 5 6 9 2 8 6 7