我正在从cin中读取一些线段。每个线段由起点和终点表示。2D坐标系,包括X和Y。
输入的线段没有排序,是随机的。(更新: 但我需要先按X排序,然后再按Y排序)
我可以读取所有线段,将它们存储在一个向量中,然后调用std::sort函数进行排序。另一方面,我可以创建一个空的std::set并在每个线段到达时插入它。集合将自动维护排序顺序。这两种方法哪种更有效率?
更新:输入的总大小(线段数量)预先已知。
我正在从cin中读取一些线段。每个线段由起点和终点表示。2D坐标系,包括X和Y。
输入的线段没有排序,是随机的。(更新: 但我需要先按X排序,然后再按Y排序)
我可以读取所有线段,将它们存储在一个向量中,然后调用std::sort函数进行排序。另一方面,我可以创建一个空的std::set并在每个线段到达时插入它。集合将自动维护排序顺序。这两种方法哪种更有效率?
更新:输入的总大小(线段数量)预先已知。
为确保效率,应该测量这两种方法的性能,但可以肯定的是,在一个 std::vector
上使用 std::sort
要比插入到 std::set
中要快得多,原因是由于局部性影响和隐藏在树插入算法中的大常数。此外,后续的查找和迭代也会更快。
(然而,std::set
更适合支持混合插入、删除、查找和迭代操作。在向量中维护顺序是很昂贵的,因为每次插入平均需要线性时间。)
使用适合您需求的具有适当语义的容器。效率通常自动从这个选择中获得。
如果您随后遇到性能瓶颈,请进行一些基准测试。
确实取决于具体情况,但可以确定的是std::set
适用于随机插入和删除。在这种情况下,您只需要进行插入操作,因此应选择std::vector
。
此外,更重要的是,如果您预先知道有多少个段落,您只需一次分配向量,它将不会每次增加两倍大小时重新分配内存。