std :: set和std :: vector有什么区别?

我正在学习STL。 我读了关于集装箱。 我有问题,当你想使用set ? 在阅读set的描述之后,它看起来像是无用的,因为我们可以用vector来代替它。 你可以说vectorset容器的利弊? 谢谢

set是有序的。 根据您提供的仿函数, 保证保持特定的顺序。 无论你添加或删除什么元素(除非你添加一个副本,这是不允许在一个set ),它总是会被sorting。

一个vector 只有你明确给出的顺序。 vector中的项目是你放置它们的地方。 如果你把它们弄乱了,那么它们就会失灵。 您现在需要sort容器进行sort ,以便按顺序排列它们。

无可否认, set使用相对有限。 通过适当的纪律,人们可以将项目插入到一个vector并保持有序。 但是,如果您不断地插入和删除容器中的项目, vector将遇到很多问题。 它会做很多复制/移动元素等,因为它实际上只是一个数组。

将项目插入vector所花费的时间与已经在vector的项目数成比例。 将项目插入一个set所需的时间与项目数量的log 2成正比。 如果项目的数量很大,这是一个巨大的差异。 log 2(100,000)是〜16; 这是一个重大的速度提高。 去除也是一样。

但是,如果您在初始化时一次完成所有的插入操作,那就没有问题了。 您可以将所有内容插入到vector ,对其进行sorting(支付一次该价格),然后使用标准algorithm对已sorting的vectors查找元素并遍历已sorting的列表。 虽然对一个set的元素进行迭代并不是很慢,但迭代一个vector的速度会更快。

所以有些情况下sorting的vector击败了一个set 。 这就是说,除非你知道这是必要的,否则你真的不应该为这种优化而付出代价。 因此,除非您对您正在编写的系统(因此知道您需要该性能)有经验,否则请使用set ,或者掌握分析数据,告诉您需要vector而不是set

它们是不同的东西:你决定如何排列vector,你也可以把尽可能多的相等的东西放到vector中。 集合按照集合的内部规则sorting(您可以设置规则,但集合将处理sorting),并且不能将多个相等项目放入集合中。

当然,你可以保持一个独特的项目vector,但是当你进行面向集合的操作时,你的性能会受到很大的影响。 例如,假设您有一组10000个项目和一个包含10000个不同无序项目的向量。 现在假设你需要检查一个值X是否在集合中的值之间(或者是向量中的值)。 当X不在这些项目中时,search向量将会慢100倍。 计算设置的联合和交叉点时,您会看到类似的性能差异。

总而言之,集合和向量具有不同的目的。 你可以使用一个vector而不是一个集合,但是这需要更多的工作,并且可能会严重影响性能。

search一个项目比一个vector(O(log(n))vs O(n))更快。 要使用vectorsearch项目,您需要遍历vector中的所有项目,但是该组使用红黑树来优化search,只有less数项目会被查找以find匹配。

该集合是有序的,这意味着您只能按顺序或颠倒的顺序从最小的一个迭代到最大的一个。

但是vector是无序的,你可以通过插入顺序来移动它。

formscpluplus.com设置:

集合是按照特定顺序存储唯一元素的容器。

所以集合是有序的,项目是唯一表示的

而vect:

向量是表示可以改变大小的数组的序列容器。

所以vector是在你填写的顺序,并可以容纳多个相同的项目

更喜欢设置:

  • 如果你想过滤多个相同的值
  • 如果你希望按照指定的顺序parsing项目(在vector中这样做需要专门对vector进行sorting)。

更喜欢vector:

  • 如果你想保持相同的值
  • 如果您希望按照与推送顺序相同的顺序parsing项目(假设您不处理vector顺序)