【发布时间】:2015-07-20 16:31:59
【问题描述】:
我需要一个数据结构(在 C++ 中)来存储在过去 N 秒内获取的 (integer,double) 对值。整数是相对毫秒的时间戳(保证是单调的),双精度是实际的数据样本。
约束:
每秒的点数未知,但一旦应用程序启动,预计不会有太大变化。典型值为每秒 10 个点。
持续时间(即 N 秒)也是先验未知的,并且可以在执行期间更改。但是当它改变时,我可以刷新所有数据并重新开始。典型值为 60 秒。
在每次迭代中,都会在集合的末尾添加一个新点,并从集合中删除旧点(即比当前时间早 N 秒)。
我不需要快速随机访问,但需要快速插入(尾部)和删除(头部)。
我现在用的是std::deque,但是感觉尾部加点,头部删除会导致频繁的重新分配。
有没有标准的方法来做到这一点?或者我应该在 std::vector 周围滚动我自己的“循环列表”包装器?
【问题讨论】:
-
更好地尝试树。或列表。
-
来自en.cppreference.com/w/cpp/container/deque; “在末尾或开头插入或删除元素 - 摊销常数 O(1)”我认为您不会比这更好。重要的问题是您如何处理这些数据?例如,持续访问重要吗?
-
“我有一种感觉,在尾端加点,从头端删除会导致频繁的重新分配”你有感觉吗?
deque专门用于从末端快速插入和删除。 -
您的想法应该是在 std::vector 周围有一个“循环列表”包装器,这应该是正确的做法,以避免内存分配/释放(特别是如果您使用 msc)
-
@Syam g++ 使用 512 字节的存储桶,因此每 512 字节您将删除/分配一个存储桶
标签: c++ vector data-structures deque