std:sort vs insert into std :: set

时间:2013-03-26 13:17:15

标签: c++ sorting stl set std

我正在阅读cin中的一些线段。每个线段由起点和终点表示。 2D。 X和Y。

输入未排序。它是随机顺序的。 (更新:但我需要先按X排序然后按Y排序)

我可以读取所有段,将它们存储在向量中,然后调用std :: sort。另一方面,我可以创建一个空的std :: set,并在它到达时插入每个段。该集将自动维护排序顺序。这两种方法中哪一种更有效?

更新:输入的总大小(段数)是预先知道的。

4 个答案:

答案 0 :(得分:12)

您应该确定这两种方法的性能,但可以肯定地认为std::sort std::vector 方式比插入{更快更快{1}}由于局部性效应和隐藏在树插入算法中的大常量。此外,后续查找和迭代将更快。

(但是,std::set更适合支持混合系列的插入和删除/查找/迭代。维护向量中的顺序是昂贵的,因为每次插入平均需要线性时间。)

答案 1 :(得分:10)

作为一个好的经验法则,提供更严格的保证,你将获得更糟糕的表现。

插入std::set可确保在每次插入后对序列进行排序

在完成所有插入操作后,插入std::vector并调用std::sort 一次可确保在对vector进行所有操作后对序列进行排序已经完成了。它不需要在所有中间插入过程中对矢量进行排序。

std::vector也表现出更好的空间局部性,并且需要更少的内存分配。 因此,我认为vector方法更快,但如果性能对您很重要,那么测量就足够了。

如果您不想在中使用 代码 数据集来衡量 更快 应用程序,那么你不关心哪个更快。

答案 2 :(得分:4)

根据需要使用具有适当语义的容器。效率通常从该选择中自动进行。

如果您遇到性能瓶颈,请进行一些基准测试。

答案 3 :(得分:4)

确实有所依赖,但可以确定std::set用于随机插入和删除。在这种情况下,您只是插入。使用std::vector。 另外,也许更重要的是,如果你事先知道有多少段,你只需要分配一次向量,它不会在每次大小翻倍时重新分配内存。