集合和向量哪个更有效
Which is more efficient, set or vector
我有点问题,最近有人告诉我,对于一个未排序的输入值,一堆随机值,比如说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"这个问题从根本上来说有点毫无意义";您不能只采用两种数据结构和排序方法,然后在没有用例的情况下问"哪个更高效?"。然而,您已经正确地测量了时间和空间需求,如果您针对真实世界的用例进行了测量,那么,您就有了答案,不是吗?
- 在C++中初始化向量映射的最有效方法
- 当映射包含字符串向量作为值时,从值中获取键的有效方法
- C++有效地找到向量中第一个最接近的匹配值?
- 如何有效地操作满足给定谓词的向量中的所有项目?
- 检查两个向量是否并行的最有效方法
- 当表示为对象的一维向量时,有效地旋转 NxM 矩阵 (C++)
- 如何有效地实现将向量的数据分配给多个变量?
- C++去除前x个元素的有效方法,在不改变向量大小的情况下将第x+1个元素推到第一个
- 如何在C++中有效地将数组移动到向量
- 将一种数据类型的向量复制到同一数据类型的结构向量中的有效方法是什么
- 如何有效地用第二个值对向量对进行分组
- 从长(且合理)稀疏向量中选择随机元素的最有效方法是什么?
- 如何在 CUDA 中(有效地)将大量向量相互比较
- 基于整数向量执行位排列的有效方法?
- 如何使用C++有效地合并排序与向量
- C++:检查向量中的元素是否大于另一个具有相同索引的元素的有效方法?
- 如何有效地规范化向量C++
- 为什么优先级队列是使用堆实现的,而我们可以更有效地使用向量来实现它
- 字符串向量的有效组合
- C++中的有效向量运算符/对临时对象的引用