首先了解一下set,我们所知道的set是STL中的一个容器,但是set实质上也是有不同的版本,我们最根本的划分就是根据其底层实现分别是红黑树和hash表分为两种,首先这两种结构最本质的区别就是有序和无序,红黑树的存储是有序的而hash表是无序存储,但它并不影响set的最主要的用法就是查找,而从查找角度来说hash表是更优于红黑树,从时间复杂度进行分析,红黑树的时间复杂度为O(logN),而hash表的时间复杂度为O(1)。所以说hash表构建的set更高效。所以在对时间要求比较严格的情况下,可以优先采用hash表构建的set,即unordered_set。
首先学习set的所有接口和使用方法,接口分为默认的成员函数,迭代器,大小和容量,增删查改和一些其他函数。
默认的成员函数
即构造,析构,拷贝构造,赋值运算符等函数,使用方法没有特殊的要求。
迭代器
正向迭代器的使用还是常规意义上的使用方法,但是方向迭代器存在一些问题,按照我们规定反向迭代器从最后一个元素开始,结束应该是第一个元素的前一个,但是
从图上可以看出在调用了反向迭代器之后并没有从最后一个元素开始,而是从正向迭代器的end()的位置开始的,打开头文件可以发现反向迭代器直接调用了正向迭代器,所以在使用时注意。这可能是编译器的差异,但是正确来说反向迭代器应该从最后一个元素开始。
大小和容量
有三个函数,分别是empty(),size(),size_max()。
分别调用,然后通过监视得:
empty()函数用来检查是否为空,size()函数反映了容器元素的个数,而size_max()通过监视是一个大于一亿,小于十亿的数,这个函数在某些特殊的场景会使用。
增删查改
增分为两种,一是插入元素,二是插入区间。
分别调用:
第一种插入元素,即插入一个同类型的元素到set中,第二个插入一个元素区间,需要注意的调用时的参数必须是一个同类型的迭代器,而且从下面两张图:
可以看出插入区级实际上只是在循环调用插入单个元素,而且依旧保持着去重的功能。
删除的函数也是两种单个和区间,进行调用:
未运行前:
第一步:
第二步:
可以看出单个的删除之后,迭代器会失效,而区间的删除是一个左闭右开的结果。
查找和改变都是用的find()函数,因为find()返回的是一个迭代器所以改变也需要用到find()函数。
其他函数
swap()交换函数用来交换两个set的所有值
clear()删除set中的所有键值
count()用来查找某个键值的值但是set只有关键,所以一般还是用来判断某个键值是否存在。
测试代码
#include<iostream>
using namespace std;
#include<map>
#include<set>
void Test()
{
set<int> s1;
s1.insert(7);
s1.insert(8);
s1.insert(9);
s1.insert(4);
s1.insert(5);
set<int> s3;
s3.insert(1);
s3.insert(2);
s3.insert(3);
s3.insert(4);
s3.insert(5);
set<int> s2(s3);
set<int>::iterator it1 = s1.begin();
set<int>::reverse_iterator it2=s1.rbegin();
set<int>::iterator it3 = s1.end();
set<int>::reverse_iterator it4 = s1.rend();
s1.empty();
s1.size();
s1.max_size();
--it3;
s2.insert(6);
s2.insert(it1, it3);
s1.erase(it3);
set<int>::iterator it5 = it1;
it5++;
s1.erase(it1, it5);
it1=s1.find(5);
}
int main()
{
Test();
return 0;
}
来源:CSDN
作者:顽强的土豆地雷
链接:https://blog.csdn.net/fuxingdecsdn/article/details/78574313