到达指定间隔的整数流需要看起来有序

时间:2015-06-03 02:25:21

标签: c++ algorithm stl

采访问题:有一个整数流以指定的间隔到达(比如每20秒)。您将使用哪个STL容器来存储它们以便整数看起来排序?当有重复时,我的回复是map / set,当没有重复或multimap / multiset时。如果存在,还有更好的答案吗?

4 个答案:

答案 0 :(得分:2)

如果您想 保留 重复项,请使用multiset。如果您不想保留重复项,请使用set

答案 1 :(得分:2)

如果它只是每20秒更新一次,那么它可能并不重要(除非它持续这么久以至于整数集变得非常巨大)。

如果您的数据速度更快,那么有些替代方案可能值得考虑。一种是使用几种载体。当数据到达时,只需将其推到其中一个向量上即可。当您需要进行有序遍历时,对新到达的数据进行排序,并与现有(已排序数据)的其他向量合并。那将按顺序给你结果,然后你可以写出另一个向量,然后再次开始相同的循环。

这里的一大优势是您处理连续数据而不是单独分配的节点。即使有可能一次使用三个向量,您的总内存使用量可能与使用setmultiset的内存使用量大致相当(甚至可能更低)。

考虑的另一种可能性(两者之间有点混合)将类似于B +树。这仍然是一棵树,因此您可以按对数复杂度进行有序插入,但是您拥有叶节点中的所有数据(相当大),因此您至少可以获得合理数量的连续访问。

答案 2 :(得分:1)

要维护已排序整数流列表,我会将 std :: priority_queue 与任何基础容器一起使用(vector或deque取决于具体用途)。

您可以将推送()保留到priority_queue,然后使用 top() pop()按排序顺序检索。

答案 3 :(得分:0)

答案应为std::setstd::map<key, value>必须考虑有<key, value>的数据对,并且需要根据key

的值对其进行排序

同样,如果您必须考虑重复项,请根据数据类型使用std::multisetstd::multimap