版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dark_cy/article/details/84837890
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中较多
待续~~~