Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std:排序与插入std::集合_C++_Sorting_Stl_Set_Std - Fatal编程技术网

C++ std:排序与插入std::集合

C++ std:排序与插入std::集合,c++,sorting,stl,set,std,C++,Sorting,Stl,Set,Std,我正在读cin的一些线段。每条线段由起点和终点表示。2D。X和Y 输入未排序。它是随机排列的。(更新:但我需要先按X再按Y排序) 我可以读入所有的段,将它们存储在一个向量中,然后调用std::sort。另一方面,我可以创建一个空的std::set,并在每个段到达时插入它。集合将自动维持排序顺序。这两种方法中哪一种更有效 更新:输入的总大小(段数)是预先知道的。您应该测量两种方法的性能,以确保,但是,由于局部性效应和树插入算法中隐藏的大常量,可以安全地假设std::sort在std::vector

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

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

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


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

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


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

使用具有适合您需要的语义的容器。效率通常会自动从该选择中获得


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

这确实取决于性能,但可以肯定的是,
std::set
用于随机插入和删除。在这种情况下,您只需插入。使用
std::vector

而且,也许更重要的是,如果您事先知道有多少段,您只需分配向量一次,它不会在每次它的大小加倍时重新分配内存

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

插入到
std::set
可以保证每次插入后序列都会被排序

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

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


如果你不想用你的应用程序中的代码来衡量你的数据集的速度,那么你就不在乎哪个更快了。

哦,真的吗?为什么会这样?@LightnessRacesinOrbit:树插入中的常数与优化排序中的常数相比相当高(想想红黑树中的再平衡)。@larsmans感谢您的更正。从酒吧发帖你为什么不试试呢?《真实世界性能数据》>“互联网上的某个家伙告诉我的”@jalf我认为这是一个老生常谈的问题,有一个普遍接受的答案。另外,在做出决定之前,我应该尝试多少种不同的输入集?您应该尝试使用与实际使用的输入集相匹配的输入集。所以你知道它在你的生活中的表现case@AgnelKurian:那是。。。悲哀…我的需求是我应该能够从左到右遍历输入。如果两个输入具有相同的x,则较小的y获胜。@AgnelKurian如果数据没有固有的顺序,请使用集合。这是一团挤在袋子里的东西。作为一个令人愉快的副作用,在迭代时,你可以从中获得字典(或任何你需要的)排序,所以如果你想在最后得到它,那么这也很方便。