std:sort vs inserting into an std::set
std:sort vs inserting into an std::set
我正在从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
。此外,也许更重要的是,如果您事先知道有多少段,您只需要分配一次向量,它不会在每次大小加倍时重新分配内存。
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- std::向量与传递值的动态数组
- 使用std::vector的OpenCL矩阵乘法
- "terminate called after throwing an instance of std::invalid_argument' what(): stoi ?"
- Hash for a std::pair, for use in an unordered_map
- 显示"terminate called after throwing an instance of 'std::bad_alloc'"时出错
- std::stoi, std::setbase, and an std::out_of_range error
- std::vector of an array
- The ordering of an std::map
- 简单的模板化函数,用于转换 std::vectors - "illegal use of this type as an expression"
- using an std::vector of std::unique_ptr
- Understanding std::hardware_destructive_interference_size an
- std:sort vs inserting into an std::set
- std::thread - "terminate called without an active exception" ,不想"加入"它