我需要一个数据结构(在C ++中),以存储在最后N秒内获取的(整数,双)对值。整数是相对毫秒的时间戳(保证是单调的),double是实际的数据样本。
约束:
每秒的点数不熟悉,但一旦应用程序启动,预计变化不大。典型值为每秒10点。
持续时间(即N秒)也不熟悉,并且可以在执行期间改变。但是当它被改变时,我可以刷新所有数据并重新开始。典型值为60秒。
在每次迭代中,一个新点被添加到集合的末尾,旧点(即当前时间的N秒以上)将从集合中删除。
我不需要快速随机访问,但需要快速插入(尾部)和删除(头部)。
我现在正在使用std :: deque,但我觉得在尾端添加点并从头端删除会导致频繁的重新分配。
有没有标准的方法来做到这一点?或者我应该在std :: vector周围滚动我自己的'循环列表'包装?
答案 0 :(得分:2)
对于“快速插入(尾部)和删除(头部)”,std::deque
是最佳的,因为它在两端分别插入和删除O(1)。您也可以使用std::queue
。标准库没有提供符合给定要求的更“高效”。
答案 1 :(得分:0)
您似乎可以使用circular buffer来提升。 在C ++ STL中没有等价物。
如果您不想依赖boost,请在std :: vector上自行实现一个非收缩的循环缓冲区,这并不难。