STL set和unordered_set容器详解

一、set

包含头文件#include<set>

set也是C++ 标准模板库的一个关联容器,他是用红黑树来实现的。

set中的元素是“按照一定的顺序”进行存储和访问的,而且每个元素只会在set中出现一次,很像map中的关键字。

其中的元素默认是按照升序进行排序的,也可以通过自定义比较函数来实现其他的排序方式。

在处理需要动态维护一些元素,并且需要快速查找、删除和添加元素的情况下,set是非常优秀的。

在这里,我们只需要知道并不要理解set的树形结构,可以将其看作一个数学意义上的集合即可。

相关操作:

set<int>st;   

st.insert(x);             //插入元素到set中

st.erase(it/x);          //删除元素,参数可以是迭代器也可以是指针

st.clear();                //清空所有元素

st.find(x);                    //查找元素,返回迭代器,如果不存在返回end()

st.count(x);               //这里有的话返回1,没有返回0

st.size();                  //返回set中的元素个数

st.empty();                 //判断是否为空

st.begin();                   //返回第一个元素的迭代器

st.end();                     //返回在最后一个元素下一个位置的迭代器

这里有高级操作,那就是upper_bound和lower_bound函数,返回一个迭代器。这个函数可以在我的另一篇博客中有解释。

STL vector的所有操作代码展示_矩阵不需要秩的博客-CSDN博客

set和vector的比较:

vector也可以用来存储有序集合,但是它的插入和删除操作时需要移动一定数量的元素,这就使得它的效率不如set,时间复杂度是O(n),而STL的set是使用红黑树实现的,可以很快地找到插入和删除的位置,时间复杂度是O(log n)。另外,set还自带去重功能,可以保证集合中元素的唯一性,而vector则需要手动去重处理。虽然vector的随机存储特性使得它在一些场景下会更优秀,但在存储有序集合时,set更适合。

set和数组的比较:

使用数组只适用于顺序存储情况下的有序集合,数组的插入和删除操作会涉及到大量的数据搬移,效率较低。而STL的set采用的是红黑树的结构,可以保证快速高效地进行元素插入、删除和查找操作,并且在插入或删除元素时会自动调整树的结构,保证树的平衡性,所以STL的set插入与删除的时间复杂度是 O(log n),查找的时间复杂度也是 O(log n),这是数组所不能比拟的。此外,STL的set还支持自动去重功能,可以方便地实现元素唯一性的限制。

二、unordered_set

包含头文件#include<unordered_set>

set是使用红黑树实现的,而unordered_set是使用哈希表实现的。unordered_set在平均情况下具有常数时间的查找复杂度,而set则具有对数时间的查找复杂度。那这样的话,它的查找,删除的插入会比set更加优秀,但有一个缺点,显然就是没有顺序。

它的操作和set的操作一模一样。

总结:

在使用STL的关联容器时,需要根据具体的场景和需求选择合适的数据结构。如果需要维护元素有序,且很少涉及到元素的插入与删除,建议使用set;如果需要快速地查找、插入和删除元素,并且不需要维护元素的顺序,建议使用unordered_set。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值