繁体   English   中英

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

[英]What is the difference between std::set and std::vector?

我现在正在学习 STL。 我阅读了有关set容器的信息。 我有疑问,什么时候要使用set 阅读set 的描述后,它看起来没有用,因为我们可以用vector代替它。 你能说一下vectorset容器的优缺点吗? 谢谢

set 根据您提供的函子,它保证保持特定顺序。 无论您添加或删除什么元素(除非您添加重复项,这在set是不允许的),它始终会被排序。

vector完全且具有您明确给出的顺序。 vector中的项目是您放置它们的位置。 如果你把它们弄乱了,那么它们就乱了; 您现在需要sort容器进行sort以将它们放回原处。

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

将项插入vector所需的时间与vector已有的项数成正比。 将项目插入到set所需的时间与项目数量的log₂成正比。 如果项目的数量很大,那就是一个巨大的差异。 log₂(100,000) 是 ~16; 这是一个重大的速度改进。 移除也是如此。

但是,如果您在初始化时一次完成所有插入,则没有问题。 您可以将所有内容插入vector ,对其进行排序(支付一次该价格),然后使用排序vectors标准算法来查找元素并迭代排序列表。 虽然迭代通过的元素set是不完全慢,遍历一个vector更快。

因此,在某些情况下,已排序的vector击败set 话虽如此,除非您知道这是必要的,否则您真的不应该为这种优化的费用而烦恼。 因此,使用set ,除非你有什么系统的经验,你写(并因此知道你需要的性能)还是有谱的手,告诉你的数据,你需要一个vector ,而不是一set

它们是不同的东西:你决定向量的排序方式,你也可以根据需要将尽可能多的相等的东西放入向量中。 集合按照集合的内部规则进行排序(您可以设置规则,但是集合会处理排序),并且您不能将多个相等的项目放入一个集合中。

当然,您可以维护一个唯一项的向量,但是当您执行面向集合的操作时,您的性能会受到很大影响。 例如,假设您有一组 10000 个项目和一个包含 10000 个不同无序项目的向量。 现在假设您需要检查值 X 是否在集合中的值中(或向量中的值中)。 当 X 不在项目中时,搜索向量会慢 100 倍。 在计算集合并集和交集时,您会看到类似的性能差异。

总而言之,集合和向量有不同的目的。 您可以使用向量而不是集合,但这需要更多的工作,并且可能会严重损害性能。

表单cluplus.com集:

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

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

而向量:

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

所以向量按照你填写的顺序,并且可以容纳多个相同的项目

喜欢套装:

  • 如果您希望过滤多个相同的值
  • 如果您希望以指定的顺序解析项目(在向量中执行此操作需要专门对向量进行排序)。

更喜欢向量:

  • 如果你想保持相同的值
  • 如果您希望以与推送它们相同的顺序解析项目(假设您不处理向量顺序)

简单的区别是 set 只能包含唯一值,并且是有序的。 因此,您可以在每次插入/删除后需要对值进行连续排序的情况下使用它。

set<int> a;
vector<int> b;
for (int i = 0; i < 10; ++i)
{
    int val = rand() % 10;
    a.insert(val);
    b.push_back(val);
}
cout << "--SET---\n"; for (auto i : a) cout << i << ","; cout << endl;
cout << "--VEC---\n"; for (auto j : b) cout << j << ","; cout << endl;

输出是

--SET---
0,1,2,4,7,8,9,
--VEC---
1,7,4,0,9,4,8,8,2,4,

针对集合搜索项目比向量更快(O(log(n))vs O(n))。 要针对向量搜索项目,您需要迭代向量中的所有项目,但该集合使用红黑树来优化搜索,只会查找少数项目以找到匹配项。

集合是有序的,这意味着你只能从最小的一个到最大的一个按顺序迭代它,或者相反的顺序。

但是向量是无序的,您可以按插入顺序移动它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM