一、基本概念
关于set,必须说明的是set关联式容器。 set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。set内部采用的是一种非常高效的平衡检索二叉树:红黑树,也称为RB树。RB树的统计性能要好于一般的平衡二叉树。
unordered_set:无序集合
multiset:允许容器中有重复的元素
set的迭代器不支持加减数操作。所有C++容器的迭代器都支持自增自减操作。
二、定义及初始化
set的构造函数为:
set<T> s;//默认构造函数
set(const set &st);//拷贝构造函数
定义:set<datatype> s;
1)set<int>s;//定义一个set容器,类型为Int
2)set<vector<int>> s;
3)set<string> s;
初始化
1)vector<string> str;
set<string> s(str.begin(),str.end());//将str元素赋值给set
2)set<int> s1;
set<int> s2(s1);//s1赋值给s2
3)set<int> s3;
s3=s1;//s1赋值给s3
三、常用操作
set中元素默认升序排列,即set中元素有序且唯一
一些函数如下:
1)s.begin();//返回指向第一个元素的迭代器
2)s.end();//返回指向最后一个元素之后的迭代器,不是最后一个元素
3)s.clear();//清除所有元素
4)s.empty();//如果为空,返回true
5)s.erase(val);//删除集合中的元素val
s.erase(s.begin());//删除集合中的第一个元素
但s.erase(s.end())会出错,可以理解为s.begin()指向第一个元素,s.end()指向最后一个元素的下一个元素
6)s.size();//返回集合中元素的个数
7)s.insert(x);//插入元素
8)s.find();//返回一个指向被查找到元素的迭代器,未找到返回s.end();
9)s.count(val);//统计元素val出现的次数,在set中该返回值不是0就是1
10)s.swap(s2);//交换2个set的元素
3.1插入
s.insert(x);//插入元素,如果s中已经存在x,则无法插入
3.2查找
s.find(x);//查找x是否存在,若存在,返回该元素的迭代器,若不存在,返回s.end()
s.count(x);//统计x的个数,结果为0或1
示例如下:
set<int> s;
s.insert(1);
s.insert(2);
s.insert(3);
s.insert(4);
s.insert(5);
auto it= s.find(3);
cout<<*it<<endl;//3
cout<<s.count(4)<<endl;//为1
3.3删除
s.erase(x);//删除单个元素 ,如果s中存在x就删除,不存在也不会报错
s.erase(s.begin(),s.begin()+3);//区间的删除是左闭右开
s.erase(pos);//删除迭代器指向的元素
s.clear();//删除整个set的所有元素
示例如下:
set<int> s;
s.insert(1);
s.insert(2);
s.insert(3);
s.insert(4);
s.insert(5);
s.erase(5);///1,2,3,4
s.erase(s.begin(),s.find(2));//2,3,4
s.erase(s.find(3));//2,4
s.clear();
3.4遍历
如求set中元素的和
set<int>::iterator iter=s.begin();
while(iter!=s.end())
{
sum+=*iter;
iter++;
}
3.5大小和交换
size();//返回容器中元素数目
empty();//判断容器是否为空
swap(st);//交换2个集合容器
示例如下:
set<int> s;
s.insert(1);
s.insert(2);
s.insert(3);
s.insert(4);
s.insert(5);
cout<<s.size()<<endl;//5
cout<<s.empty()<<endl;//0
set<int> s2;///1,2,3,4,5
3.6排序
set容器默认排序规则为从小到大,可以使用自定义排序规则。可以利用仿函数来实现。
示例1:set存放内置数据类型
set<int> s;
s.insert(1);
s.insert(2);
s.insert(3);
s.insert(4);
s.insert(5);
for(auto it =s.begin();it!=s.end();it++)
cout<<*it<<" ";
cout<<endl;//输出1,2,3,4,5
set<int,Compare> s2;
s2.insert(1);
s2.insert(2);
s2.insert(3);
s2.insert(4);
s2.insert(5);
for(auto it =s2.begin();it!=s2.end();it++)
cout<<*it<<" ";
cout<<endl;//输出5,4,3,2,1
示例2:set存放自定义数据类型
set<student> s;
student t1(1,"h1");
student t2(2,"h2");
student t3(3,"h3");
student t4(4,"h4");
set<student,Compare> s2;
s2.insert(t1);
s2.insert(t2);
s2.insert(t3);
s2.insert(t4);
for(auto it =s2.begin();it!=s2.end();it++)
cout<<(*it).age<<" "<<(*it).name<<" ";
cout<<endl;//输出4,3,2,1
set存放自定义数据类型时,必须指定排序规则