Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 到达指定间隔的整数流需要进行排序_C++_Algorithm_Stl - Fatal编程技术网

C++ 到达指定间隔的整数流需要进行排序

C++ 到达指定间隔的整数流需要进行排序,c++,algorithm,stl,C++,Algorithm,Stl,面试问题:有一个整数流以指定的间隔到达(比如每20秒)。您将使用哪个STL容器来存储它们,以便整数看起来是排序的?当没有重复项时,我的答复是map/set;当有重复项时,我的答复是multimap/multiset。如果有更好的答案吗?答案应该是std::set STD::MAP>/COD>当有一对数据为“代码> 时,必须考虑它需要按照键< /代码> 的值排序。 以相同的方式,如果必须考虑重复,使用 STD::MultStudio和 STD::MultIMAP 根据数据类型。 < P>答案应该是

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

答案应该是
std::set
<代码> STD::MAP>/COD>当有一对数据为“代码> <代码>时,必须考虑它需要按照<代码>键< /代码>

的值排序。

以相同的方式,如果必须考虑重复,使用<代码> STD::MultStudio和 STD::MultIMAP 根据数据类型。

< P>答案应该是代码> STD::SET代码> STD::MAP>/COD>当有一对数据为“代码> <代码>时,必须考虑它需要按照<代码>键< /代码>

的值排序。

以相同的方式,如果必须考虑重复,使用<代码> STD::MultStudio和 STD::MultIMAP 根据数据类型。

< P>使用“<代码>多集< /代码> >如果您想要<强>保存< /强>重复。如果不想保留重复项,请使用
集合

如果要保留重复项,请使用
多集合
。如果您不想保留重复项,请使用

如果它只每隔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