【问题标题】:c++: circular buffer with integer indices as iterators?c ++:以整数索引作为迭代器的循环缓冲区?
【发布时间】:2012-10-31 22:46:43
【问题描述】:

我正在编写一个 C++ 应用程序,我需要缓存最后到达的 n 条消息。而且我需要一种方法来获取存储的最后一条消息的索引,以便以后可以找出所有随后到达的消息。由于该索引必须通过 HTTP 来回传输,因此它应该易于表示和检查,因为它可能成为不安全的用户内容。

到目前为止,我一直在考虑使用boost::circular_buffer。但是除了迭代器之外,我找不到找出最新条目索引的方法。

那么有没有办法(有效地)获取整数索引?
或者有没有办法将迭代器编码和解码成一个可保存验证的字符串?
或者甚至是我还没有想到的完全不同的方式?

(允许 C++11 之前的任何内容;STL/stdlib 和 Boost 高度优先)

【问题讨论】:

  • 是否有某些原因必须将其限制为一组数字 n? std::deque 在这里听起来很合适,减去设置的大小。
  • @Griwes 我同意,但由于标准之前的普遍用法,它经常以白话形式使用。这就是你不在伤口上贴绷带的原因;你用的是该死的创可贴。我尽可能使用“标准库”、“std lib”、“stdlib”,但不要指望这种用法会很快普及。与此同时,放松身心,享受一杯清爽的调味混合饮料,或者我们在这个星球的四个角落称之为 Kool-Aid。
  • 要获取索引,您只需减去或使用std::distance(如果这是您要查找的内容)。
  • 这是一个消息数量固定的循环缓冲区吗?如果是这样,使用 std::vector 怎么样?

标签: c++ boost stl c++11 circular-buffer


【解决方案1】:

如果您不关心从缓冲区中擦除项目直到它们被新数据覆盖,那么使用std::vector 实现这一点几乎是微不足道的。

std::vector<item> buffer;
buffer.reserve(BUFFER_SIZE);
int next_slot = 0;

// to insert:
if (next_slot >= buffer.size())
    buffer.push_back(new_item);
else
    buffer[next_slot] = new_item;
++next_slot;
if (next_slot >= BUFFER_SIZE)
    next_slot = 0;

【讨论】:

  • 你是对的,带有一些自定义逻辑的好 ol'std::vector 应该可以很好地解决问题。
  • 调用reserve只会设置容量,不会设置大小。我认为您想在那里“调整大小”,可以将其替换为将大小作为第一个参数的构造函数调用。
  • @dma 请注意,如果要写入超过当前大小的数据,它将使用push_backreserve 在这种情况下仅用作提高效率的辅助手段,可以完全删除。
  • @MarkRansom 没错。如果您使用调整大小,那么您根本不需要大小检查。您可以插入“next_slot”并增加/修改。当然,访问变得更加棘手,因为您必须处理可能部分填充的缓冲区。
猜你喜欢
  • 2020-06-23
  • 1970-01-01
  • 2021-09-01
  • 1970-01-01
  • 2014-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-01
相关资源
最近更新 更多