STL—set(集合容器)

set具有以下特点:

  1、元素唯一,就是说不能插入重复的键值。
  2、插入元素自动按从小到大排序(可以利用重载符定义比较规则)。
  3、不能直接修改元素,否则会导致内部位置变化。
  4、构造set容器主要是为了快速检索

头文件

#include<set>

:set 和 multiset 都包含在该头文件内,而且 multiset 和 set 操作基本一样。其区别无外乎一下三点:
  1、multiset允许插入相同键值;
  2、multiset 用erase()按照键值删除元素时,会删除所有键值相同的元素,
  3、multiset 中find()会返回重复键值中第一个元素的迭代器。

定义和初始化

int a[]={1,2,3,4,5,3};
set<int> s;       //这样就完事了,定义了一个int类型的空的set对象s
set<int> s(a,a+6);//定义对象s,并将数组a中的前6个元素插入s
set<int> st(s);   //复制构造函数,st是s的副本,s必须是set对象

利用insert插入元素

s.insert(a,a+4)    //将数组a的前4个元素插入s
s.insert(8);       //参数也可以是变量表达式,比如 i+1

利用iterator遍历元素

 set<int>::iterator it;
 for(it=s.begin();it!=s.end();it++)
 {
     cout<<*it<<endl;
 }

注:注:set 对象不可以用下标运算符 [] 遍历,反向遍历则需要用到reverse_iterator,rbegin和rend。

删除或清空元素

s.erase(3);           //删除键值为3的元素,返回被删元素的个数
s.erase(it);          //删除迭代器it所指元素,返回指向下一元素的迭代器
s.erase(it_1,it_2);   //删除迭代器所指区间的所有元素,返回指向下一元素的迭代器
s.clear()             //清空集合元素

:按键值删除元素,erase()会返回删除元素的个数,这个功能在multiset中用比较有意义。

元素查询

s.find(n);          //找到则返回指向元素 n的迭代器,否则返回end();
s.lower_bound(n)    //返回第一个大于或等于 n的元素的迭代器
s.upper_bound(n)    //返回第一个大于 n的元素的迭代器

利用重载符定义比较规则

非结构体定义:
   struct comp
   {
       bool operator () (const int &a,const int &b)
       {
           return a>b;//大顶堆
       }
   };
   引用 :set<int,comp> s;
结构体定义:
   struct lei
   {
       int x;
       int y;
       bool operator < (const lei &a)const
       {
           return a.x>x;  //以结构体中的x,做比较元素
       }
   }; 
   引用:set<lei> s;

其他常用操作

s.size();  //返回元素个数
s.empty(); //判断是否为空,空返回真,否则返回假
s.count(); //返回给定元素出现的次数,用在multiset中较多
待续~~~

你可能感兴趣的:(STL)