我能做的一件事是分配一个大小为n的向量并存储所有数据 然后使用sort(begin(),end())对其进行排序。否则,我可以继续推杆 地图或集合中的数据是自行排序的,所以我不必这样做 事后排序。但在这种情况下,插入元素可能更多 由于重新排列而导致代价高昂(我猜)。
因此,对于大范围的n(对象的数量)来说,这是最短时间的最佳选择
答案 0 :(得分:5)
这取决于具体情况。
map
和set
通常是红黑树,他们应该做很多工作来保持平衡,否则对它的操作会很慢。它不支持随机访问。因此,如果您只想排序一次,则不应使用它们。
但是,如果您想继续将元素插入容器并保持顺序,map
和set
将花费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>