首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >std::set和std::vector有什么区别?

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

Stack Overflow用户
提问于 2011-12-31 14:24:42
回答 3查看 94.5K关注 0票数 77

我现在正在学习STL。我读到过关于set容器的文章。我有一个问题,你什么时候想使用set?在阅读了description of set之后,它看起来是无用的,因为我们可以用vector替换它。你能说出vectorset容器的优点和缺点吗?谢谢

EN

回答 3

Stack Overflow用户

发布于 2011-12-31 14:34:55

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

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

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

票数 12
EN

Stack Overflow用户

发布于 2011-12-31 14:39:18

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

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

但是向量是无序的,你可以按插入顺序遍历它。

票数 6
EN

Stack Overflow用户

发布于 2020-02-19 13:50:26

简单的区别是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,
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8686725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档