存储所有数据后,存储在std :: map / std :: set vs中对矢量进行排序

时间:2018-05-06 10:49:20

标签: c++ data-structures stdvector stdmap stdset

  • 语言:C ++
  • 我能做的一件事是分配一个大小为n的向量并存储所有数据 然后使用sort(begin(),end())对其进行排序。否则,我可以继续推杆 地图或集合中的数据是自行排序的,所以我不必这样做 事后排序。但在这种情况下,插入元素可能更多 由于重新排列而导致代价高昂(我猜)。

    因此,对于大范围的n(对象的数量)来说,这是最短时间的最佳选择

2 个答案:

答案 0 :(得分:5)

这取决于具体情况。

mapset 通常是红黑树,他们应该做很多工作来保持平衡,否则对它的操作会很慢。它不支持随机访问。因此,如果您只想排序一次,则不应使用它们。

但是,如果您想继续将元素插入容器并保持顺序,mapset将花费O(logN)时间,而已排序的vector为{{} 1}}。后者要慢得多,所以如果你想要经常插入和删除,你应该使用O(N)map

答案 1 :(得分:3)

2之间的区别是显而易见的!

使用集合,您插入的每个元素的复杂度都会O(log(N))。因此,通过结果,您得到O(N log(N)),这是插入排序的复杂性。

在向量中添加所有内容都很复杂O(1),因为C ++ 11(在它之前,O(N log(N))平均有std::sort,所以对它进行排序将为O(N log(N))。 )。 排序后,您可以使用binary_search来获得与集合相同的复杂性。

使用向量作为集合的API并不友好,尽管它确实提供了很好的性能优势。只有当您可以批量插入数据或查找量远大于内容操作时,此偏离过程才有用。当你必须稍后扩展时,可以对部分排序的向量进行排序。 最后,必须注意到你没有相同的迭代器失效保证。

那么,为什么向量更好?缓存局部! 向量具有单个存储块中的所有数据,因此处理器可以进行预取,而对于一个集合,存储器分散在需要数据以找到下一个地址的地方。当你可以忍受限制时,这使得vector比std :: set更适合大型数据。

为了给你一个想法,在我正在研究的代码库上,我们有几个基于向量的set和map实现,这些向量有自己的叙述功能。(例如:没有擦除或没有operator [])< / p>