C++ 到达指定间隔的整数流需要进行排序
面试问题:有一个整数流以指定的间隔到达(比如每20秒)。您将使用哪个STL容器来存储它们,以便整数看起来是排序的?当没有重复项时,我的答复是map/set;当有重复项时,我的答复是multimap/multiset。如果有更好的答案吗?答案应该是C++ 到达指定间隔的整数流需要进行排序,c++,algorithm,stl,C++,Algorithm,Stl,面试问题:有一个整数流以指定的间隔到达(比如每20秒)。您将使用哪个STL容器来存储它们,以便整数看起来是排序的?当没有重复项时,我的答复是map/set;当有重复项时,我的答复是multimap/multiset。如果有更好的答案吗?答案应该是std::set STD::MAP>/COD>当有一对数据为“代码> 时,必须考虑它需要按照键< /代码> 的值排序。 以相同的方式,如果必须考虑重复,使用 STD::MultStudio和 STD::MultIMAP 根据数据类型。 < P>答案应该是
std::set
<代码> STD::MAP>/COD>当有一对数据为“代码> <代码>时,必须考虑它需要按照<代码>键< /代码> 的值排序。
以相同的方式,如果必须考虑重复,使用<代码> STD::MultStudio和
以相同的方式,如果必须考虑重复,使用<代码> STD::MultStudio和
集合
如果要保留重复项,请使用多集合
。如果您不想保留重复项,请使用集如果它只每隔20秒更新一次,那么它可能根本不重要(除非它持续太久,以至于整数集变得非常庞大)
如果您的数据输入速度快得多,那么有一些替代方案可能值得考虑。一种是使用几个向量。当数据到达时,只需将其推到其中一个向量上。当需要按顺序遍历时,对新到达的数据进行排序,并与现有(已排序的数据)的其他向量合并。这将按顺序给出结果,然后将结果写出另一个向量,然后再次开始相同的循环
这里最大的优点是,您处理的是连续数据,而不是单独分配的节点。即使一次可能使用三个向量,您的总内存使用量也可能与使用集
或多集
的内存使用量大致相等(甚至可能更小)
另一个可能考虑的问题(这是两者之间的一个混合点)将类似于B+树。这仍然是一棵树,因此您可以按对数复杂度进行顺序插入,但叶节点中有所有数据(这些数据相当大),因此您至少可以获得合理数量的连续访问。如果只每隔20秒更新一次,这可能并不重要(除非它持续很长时间,以至于整数集变得非常巨大)
如果您的数据输入速度快得多,那么有一些替代方案可能值得考虑。其中之一是使用两个向量。当数据到达时,只需将其推到其中一个向量上。当您需要按顺序遍历时,对新到达的数据进行排序,然后与现有(已排序数据)的另一个向量合并.这将按顺序给出结果,然后将结果写出另一个向量,然后再次开始相同的循环
这里最大的优势是处理连续的数据而不是单独分配的节点。即使一次使用三个向量,您的总内存使用量也可能与使用集
或多集
的内存使用量相等(甚至可能更小)
另一个可能考虑的问题(这是两个之间的一个混合点)将类似于B+树。这仍然是一棵树,所以你可以按照对数复杂度进行插入,但是你有叶子节点中的所有数据(相当大)。因此,您至少可以获得合理数量的连续访问。
要维护一个排序的整数流列表,我将使用std::priority_queue和任何底层容器(向量或deque,取决于特定用途)
您可以将push()保留到优先级队列,并使用top()和pop()按排序顺序进行检索。要维护一个排序的整数流列表,我将对任何底层容器使用std::priority\u队列(矢量或矢量取决于特定用途)
您可以将push()ing保留到优先级队列,并使用top()和pop()按排序顺序检索。何时显示排序?如果该流有一个最终结束,然后显示结果,则std::map
将起作用,第二对是保留重复项的出现计数,另一对是std::set
。如果该流是永久流,或者如果该值将以一些重复项发出对于中间延迟,答案是“无”,因为语言委员会不方便地将水晶球容器排除在标准之外。为什么要映射?这需要成对的相关值。你只有一个整数。“看排序”,这到底意味着什么?要么它们被排序,然后它们看起来被排序了,要么它们没有被排序,然后就没有被排序了。@Urich:你说得对。有点困惑。我没有问它是否应该以排序的方式保存。Set使用RBL树存储元素,但它们没有以排序的方式保存在容器中。但是当你打印出内容时,它们看起来像是ar以排序顺序作为迭代器对其执行顺序遍历。您的评论对我来说没有意义:如果树中的元素没有排序,那么顺序遍历如何将它们输出为排序的?无论如何,当遇到不完整的规范时,您可能会问到正确的问题。何时显示排序?如果是这样的话流有一个最终结束,然后显示结果,一个std::map