集合和向量哪个更有效

Which is more efficient, set or vector

本文关键字:有效 向量 集合      更新时间:2023-10-16

我有点问题,最近有人告诉我,对于一个未排序的输入值,一堆随机值,比如说100万个,使用集合比使用向量更有效,然后用基本的排序算法函数对所述向量进行排序,但当我使用它们,并通过时间函数、终端和valgrind检查它们时,它表明,即使添加了被调用的排序函数,向量的时间复杂度和空间使用都更快。建议我使用该集合的人在C++语言方面比我更有经验,但在听取别人的建议之前,我总是要自己测试一下。测试代码如下。

用于设置

std::set<int> testSet;
  for(int i(0); i<= 1000000; ++i)
    testSet.insert(-i);

对于矢量

 std::vector<int> testVector;
  for(int i(0); i<= 1000000; ++i)
    testVector.push_back(i * -1);
  std::sort(testVector.begin(), testVector.end());

我知道这些不是随机变量,这是不公平的,因为集合不允许重复,向量也允许,所以对于这个基本函数点,它们的大小会不同。有人能澄清为什么要使用这个集合吗?并没有重复的意思。

我也没有对无序集合进行任何测试。不太确定两个给定点之间的差异。

这太模糊了,忽略/遗漏了几个关键因素。如果你的朋友正是这么说的,那么你的朋友(不管他或她的经历如何(错了。更有可能的是,你在某种程度上误解了他们的话,并从中解读了事情的简化版本。

当你想要一个排序的最终产品时,当你插入一个集合时,排序是"摊销"的,因为每次你都会得到一些排序操作。如果您将周期性地多次插入,那么工作负载的分散可能就是您想要的。当加起来的时候,总数可能仍然超过一个向量(考虑偶尔的重新平衡等等;你的向量只需要偶尔移动到一个更大的内存块中(,但你已经把它分散开来,以免明显减慢程序的其他部分。

但是,如果您只是将所有元素转储到一个向量中并直接排序,那么容器&算法,但您可能不介意它花费明显的时间。

你还没有真正详细地说明你的用例,所以我不会假装在这里给出细节,但对你提出的问题,唯一可能的答案是"这取决于"answers"这个问题从根本上来说有点毫无意义";您不能只采用两种数据结构和排序方法,然后在没有用例的情况下问"哪个更高效?"。然而,您已经正确地测量了时间和空间需求,如果您针对真实世界的用例进行了测量,那么,您就有了答案,不是吗?