排序不同数字的更好方法是什么? 在C++中使用STL,这两种操作中的两个操作占用较少的CPU时间来对大的不同的数字进行排序: 将元素推到一个集合中 将元素存储在向量中并调用sort()函数

排序不同数字的更好方法是什么? 在C++中使用STL,这两种操作中的两个操作占用较少的CPU时间来对大的不同的数字进行排序: 将元素推到一个集合中 将元素存储在向量中并调用sort()函数,c++,sorting,stl,C++,Sorting,Stl,如果是一次性操作,我会使用std::vector后跟std::sort 就渐近复杂性而言,这两个解应该是等价的:在一个集合中插入是O(log(n)),对n个元素插入是O(nlog(n))() 另一方面,向量中的插入(前提是您事先知道大小)是O(N),排序是O(N log(N)),因此全局上是O(N log(N)) 但是:向量需要一次性分配(或者,如果您不知道最终大小,则在典型实现中,它应该达到O(log(N))重分配中的最终大小);另一方面,如果集实现为RB树,则需要为每个节点分配,这意味着您必

如果是一次性操作,我会使用
std::vector
后跟
std::sort

就渐近复杂性而言,这两个解应该是等价的:在一个集合中插入是O(log(n)),对n个元素插入是O(nlog(n))()

另一方面,向量中的插入(前提是您事先知道大小)是O(N),排序是O(N log(N)),因此全局上是O(N log(N))

但是:向量需要一次性分配(或者,如果您不知道最终大小,则在典型实现中,它应该达到O(log(N))重分配中的最终大小);另一方面,如果集实现为RB树,则需要为每个节点分配,这意味着您必须调用分配器N次,而POD容器中的分配器调用可能会成为瓶颈之一。此外,树通常具有较少的缓存位置并使用更多内存,因此所有这些开销可能会影响性能

此外,big-O表示法显示了函数的时间依赖性,但隐藏了乘法常数;不要相信我的话,但我几乎可以肯定,由于每个元素都要做额外的簿记工作,N*set插入最终会比单个排序花费更多(树插入通常需要一些工作来恢复RB树属性)


另一方面,如果您必须对数据结构进行排序(新数据来自by),那么集合通常是正确的解决方案



但是,像往常一样,当对配置文件有疑问时。

如果它是一次性操作,我会使用
std::vector
,后跟
std::sort

就渐近复杂性而言,这两个解应该是等价的:在一个集合中插入是O(log(n)),对n个元素插入是O(nlog(n))()

另一方面,向量中的插入(前提是您事先知道大小)是O(N),排序是O(N log(N)),因此全局上是O(N log(N))

但是:向量需要一次性分配(或者,如果您不知道最终大小,则在典型实现中,它应该达到O(log(N))重分配中的最终大小);另一方面,如果集实现为RB树,则需要为每个节点分配,这意味着您必须调用分配器N次,而POD容器中的分配器调用可能会成为瓶颈之一。此外,树通常具有较少的缓存位置并使用更多内存,因此所有这些开销可能会影响性能

此外,big-O表示法显示了函数的时间依赖性,但隐藏了乘法常数;不要相信我的话,但我几乎可以肯定,由于每个元素都要做额外的簿记工作,N*set插入最终会比单个排序花费更多(树插入通常需要一些工作来恢复RB树属性)


另一方面,如果您必须对数据结构进行排序(新数据来自by),那么集合通常是正确的解决方案



但是,像往常一样,当你对个人资料有疑问时。

我尝试了较小的输入为什么人们会尝试微优化?@Arun现在尝试较大的输入,你会有你的答案,不是吗?@Arun:他指的是,从技术上讲,STL是SGI的一个库,它稍稍适合于成为C++标准库的当前容器/算法部分;因此,您所指的并不是技术上的STL,尽管它仍然被通俗地称为STL。这是非常平常的(如果你问我)在C++标签中挑剔的练习,那么,MatteoItalia,这是最准确的评估。(我不做的是去当地的酒馆喝点啤酒和蜂蜜酒。)我尝试了更小的投入为什么人们会尝试微优化?@Arun现在尝试更大的投入,你会得到你的答案,不是吗?@Arun:他指的是,从技术上讲,STL是SGI的一个库,它稍稍适合于成为C++标准库的当前容器/算法部分;因此,您所指的并不是技术上的STL,尽管它仍然被通俗地称为STL。这是非常平常的(如果你问我)在C++标签中挑剔的练习,那么,MatteoItalia,这是最准确的评估。(我不想去当地的酒馆喝点啤酒和蜂蜜酒。)