![](/img/trans.png)
[英]What is the difference between std::vector<int> and std::vector<int>*?
[英]What is the difference between std::set and std::vector?
我现在正在学习 STL。 我阅读了有关set
容器的信息。 我有疑问,什么时候要使用set
? 阅读set 的描述后,它看起来没有用,因为我们可以用vector
代替它。 你能说一下vector
和set
容器的优缺点吗? 谢谢
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.