C++ STL列表与设置

use*_*137 22 c++ containers stl list

这两个中的哪一个对于随机插入和删除更快?我猜列表,将值作为关键字和套装似乎也很有吸引力.迭代整个容器的性能是否相似?

谢谢!

cpx*_*cpx 36

名单

  1. 搜索(线性时间).
  2. 插入,删除,移动(需要恒定时间).
  3. 可以订购元素.
  4. 可以对元素进行排序.
  5. 元素可能重复.

  1. 搜索(大小对数).
  2. 插入和删除(一般为logarithimic).
  3. 元素是无序的.
  4. 元素总是从低到高排序.
  5. 元素是独一无二的

  • 在集合中,元素是按顺序排序的,而不是按顺序排序.他们排序. (9认同)
  • @TokenMacGuy,@ Dave17 C++集确实已经排序,但它们不是*排序的,因为你不能通过将任意元素放在任意位置来强制执行任意顺序.这是"有序"和"有序"之间的关键区别.在数学意义上观察集合要好得多:它们根本就没有被命令,期间.而且它们被排序的事实是一个实现细节,只是为了支持效率.底线:如果订单无关紧要但使用独特元素,则使用集合. (5认同)
  • @wilhelmtell:集合的排序属性不是任意的实现细节,而是库的固定保证.另一个集合`std :: hashset`提供了set语义,但没有按顺序遍历.不同的容器为不同的使用模式. (3认同)

Han*_*ant 19

std :: list是插入和删除的O(1).但您可能需要O(n)才能找到插入或删除点.std :: set是插入和删除的O(log(n)),它通常实现为红黑树.

考虑一下找到插入/删除点以便做出选择的努力.


Dan*_*nas 11

首先考虑语义,然后考虑性能.

如果你有一组整数,并且你插入整数6,8,13,8,20,6和50,你最终会得到一个包含以下五个元素的集合: { 6, 8, 13, 20, 50 }.

如果你用列表做到这一点,你最终会得到一个包含以下七个元素的列表:{ 6, 8, 13, 8, 20, 6, 50 }.

所以你想要什么?将容器的速度与这种不同的语义进行比较是没有意义的.

  • 如果两者都有效,那么你说订单无关紧要.这实际上是集合的一个点,而不是列表.你不应该根据自己喜欢的东西来选择一个容器:它们在界面方面都非常相似,所以如果你对一个容器感到很舒服,那么你几乎对所有容器都感到满意. (4认同)