我正在阅读cin中的一些线段。每个线段由起点和终点表示。 2D。 X和Y。
输入未排序。它是随机顺序的。 (更新:但我需要先按X排序然后按Y排序)
我可以读取所有段,将它们存储在向量中,然后调用std :: sort。另一方面,我可以创建一个空的std :: set,并在它到达时插入每个段。该集将自动维护排序顺序。这两种方法中哪一种更有效?
更新:输入的总大小(段数)是预先知道的。
答案 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
。
另外,也许更重要的是,如果你事先知道有多少段,你只需要分配一次向量,它不会在每次大小翻倍时重新分配内存。