采访问题:有一个整数流以指定的间隔到达(比如每20秒)。您将使用哪个STL容器来存储它们以便整数看起来排序?当有重复时,我的回复是map / set,当没有重复或multimap / multiset时。如果存在,还有更好的答案吗?
答案 0 :(得分:2)
如果您想 保留 重复项,请使用multiset
。如果您不想保留重复项,请使用set
。
答案 1 :(得分:2)
如果它只是每20秒更新一次,那么它可能并不重要(除非它持续这么久以至于整数集变得非常巨大)。
如果您的数据速度更快,那么有些替代方案可能值得考虑。一种是使用几种载体。当数据到达时,只需将其推到其中一个向量上即可。当您需要进行有序遍历时,对新到达的数据进行排序,并与现有(已排序数据)的其他向量合并。那将按顺序给你结果,然后你可以写出另一个向量,然后再次开始相同的循环。
这里的一大优势是您处理连续数据而不是单独分配的节点。即使有可能一次使用三个向量,您的总内存使用量可能与使用set
或multiset
的内存使用量大致相当(甚至可能更低)。
考虑的另一种可能性(两者之间有点混合)将类似于B +树。这仍然是一棵树,因此您可以按对数复杂度进行有序插入,但是您拥有叶节点中的所有数据(相当大),因此您至少可以获得合理数量的连续访问。
答案 2 :(得分:1)
要维护已排序整数流列表,我会将 std :: priority_queue 与任何基础容器一起使用(vector或deque取决于具体用途)。
您可以将推送()保留到priority_queue,然后使用 top()和 pop()按排序顺序检索。
答案 3 :(得分:0)
答案应为std::set
。 std::map<key, value>
必须考虑有<key, value>
的数据对,并且需要根据key
同样,如果您必须考虑重复项,请根据数据类型使用std::multiset
和std::multimap
。