set即集合,应队长要求,本弱学习一些set的基本操作。

本弱学习set参考博客:https://blog.csdn.net/qq_42232118/article/details/82021521

1,使用set需要头文件<set>.

2,set的定义:set<typename>name,很多容器比如map vector queue都是这样定义的。set里面的元素不可以重复并且会自动按照从小到大排序。假如定义set<int>s;

  不可以重复的意思是如果加入两个相同的元素,set会自动去重。

3,set元素的访问需要迭代器(本弱不会说迭代器也是今天现学的)

先来看看我现学的迭代器的知识:

迭代器分为const_iterator和iterator两种。前者只能是从容器中读元素,而后者不仅可以读还可以改变元素的值。
定义迭代器it set<int>::iterator it;
那么元素的值是 *it.(迭代器其实可以理解为地址,*it才是取地址里面的东西)。
it指代一个位置的话,it++就指向了下一个位置,it--就指向了下一个位置

 

set不允许访问*(it+1)这样访问,只能遍历地取,当然遍历地时候我们让it++就可以了。但是set不支持it<s.end()的写法,从头遍历到尾可以这么写:

for(it=s.begin();it!=s.end();it++)

 

在这里解释一下为什么我们不需要最后一个元素,因为容器里面end()返回的是元素最后一位的下一位,也就是end()这个地方是没有元素的。

4,set常用函数:

  (1)s.insert(x)插入元素x,set会自动按照从小到大排序并去重。

  (2)s.find(x),返回x的值得迭代器,所以要用it=s.find(x),而不能定义int=s.find(x),如果x不存在于set中,会返回s.end();

    (3)s.erase(x) 或  s.erase(s.find(x)),删除元素x。

   (4)s.erase(first,second),删除从first到second-1位置的元素,其中first和second都是迭代器

  (5)s.size()返回set中元素的个数

  (6)s.clear()清空set

set内部实现是红黑树,所以每次操作大概是logn的复杂度?本弱现在还不清楚。