支持弹出最早插入和最大

时间:2016-04-29 04:49:27

标签: c++ data-structures queue

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

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

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

有优先级队列,支持max,但他们不会自动处理大小。我可以写自己的功能来做这件事,但我想不管怎么说/

1 个答案:

答案 0 :(得分: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

您不能同时完全同时执行这两项操作,因为首先要求删除最旧的元素需要按插入顺序排序,而找到min或max元素的要求需要按某种方式按值排序(线性) ,或像priority_queue那样的堆。)

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

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