std:sort vs inserting into an std::set

std:sort vs inserting into an std::set

本文关键字:std an set into vs sort inserting      更新时间:2023-10-16

我正在从cin中读取一些线段。每条线段由起点和终点表示。2 d。X和y

输入没有排序。它是随机排列的。(更新:但我需要它们先按X排序,然后按Y排序)

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

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

您应该测量这两种方法的性能,但可以肯定的是,由于局部性效应和隐藏在树插入算法中的大常数,假设std::vector上的std::sort比插入std::set快得多。此外,后续的查找和迭代将更快。

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

根据经验,提供的保证越严格,性能就越差。

插入到std::set保证序列在每次插入之后排序

插入到std::vector中,并在所有插入操作完成后调用std::sort ,确保在vector上的所有操作完成后对序列进行排序。它不要求在所有中间插入过程中对vector进行排序。

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

如果你不关心衡量你的应用程序中的数据集与你的代码中哪个更快,那么你也不关心哪个更快。

使用具有适合您需要的语义的容器。这种选择通常会自动产生效率。

如果你遇到了性能瓶颈,做一些基准测试。

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