一、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。