【问题标题】:C++ data structure that supports pop oldest inserted and max支持pop最旧插入和最大的C++数据结构
【发布时间】:2016-04-29 04:49:26
【问题描述】:

我花了一段时间研究这个问题,但还没有找到答案,而且我知道具有各种功能的 40 多年历史的语言可能会做到这一点。

我正在寻找一种只能容纳 500 个整数的数据结构。我需要能够将其中的最大 int 与给定的 int 进行比较。我还希望结构删除最早插入的,如队列。

是否有支持两者的数据结构?除了在上面运行min() 之外,我不需要随机访问。

有优先级队列,支持max,但它们不自动处理大小。我可以编写自己的函数来执行此操作,但我想我还是会问/

【问题讨论】:

  • 听起来您需要在现有容器(例如列表)周围滚动自己的包装器,在插入时跟踪最小/最大值,这将非常有效..
  • they don't autohandle the size 是什么意思?
  • 数据结构不处理大小。必须手动弹出。
  • 因此,当您有 500 个元素并再插入一个时,您希望自动弹出最旧的元素 - 是吗?
  • 相关查询:stackoverflow.com/questions/2933758/…希望对您有帮助:)

标签: c++ data-structures queue


【解决方案1】:

要保存 500 个整数,您需要一个循环缓冲区。它在 Boost 中:

http://www.boost.org/doc/libs/release/doc/html/circular_buffer.html

但这不会帮助您找到容器中的最小值或最大值。为此,您将需要这些:

http://en.cppreference.com/w/cpp/algorithm/min_element http://en.cppreference.com/w/cpp/algorithm/max_element http://en.cppreference.com/w/cpp/algorithm/minmax_element

你不能同时做到这两个,因为删除最旧元素的要求首先需要按插入顺序排序,而找到最小或最大元素的要求需要以某种方式按值的顺序排序(线性或就像priority_queue 这样的堆)。

在现代机器上查找 500 个整数的最小值/最大值应该非常快。但是如果你反对线性扫描的算法复杂性,你可以试试这个:

  1. 将您的元素存储在set<int> 中,这会为您提供*begin()*rbegin() 以获取最小值和最大值。
  2. 将迭代器存储到单独的循环缓冲区中的集合中。设置迭代器不会因其他迭代器的插入和擦除而失效,因此这是安全的。当循环缓冲区已满时,从集合中删除最旧的迭代器,然后从循环缓冲区中删除它。

【讨论】:

  • 是的,我在搜索中遇到过。试图找到一个内置的解决方案,因为我是 C++ 的新手,而且有这么多的库!
  • @JohnAllen:STL 有很多容器,但在 Boost 中还有更多容器,在其他地方(英特尔 TBB、BitMagic 等)还有更多。如果您想要最佳的 big-O 性能,我已经用混合想法更新了我的答案。
  • “你不能同时做到这两点”——当然可以,如果你使用的数据结构是两个链表的组合,同时以年龄顺序和排序顺序维护。或者也许是一个树/堆和一个列表,以便按排序顺序有效插入。但我怀疑这是否在标准库中。
猜你喜欢
  • 1970-01-01
  • 2016-01-02
  • 1970-01-01
  • 1970-01-01
  • 2015-09-30
  • 1970-01-01
  • 2013-11-16
  • 2013-03-05
  • 2022-06-10
相关资源
最近更新 更多