简单介绍
- 集合(Set)是一种包含已排序对象的关联容器,其中所包含的元素是唯一的,集合中的元素按一定的顺序排列。元素插入过程是按排序规则插入,所以不能指定插入位置。
- set采用红黑树变体的数据结构实现,红黑树属于平衡二叉树。在插入操作和删除操作上比vector快。
- set不可以直接存取元素。(不可以使用at.(pos)与[]操作符)。
- 不可以直接修改set容器中的元素值,因为该类容器是自动排序的。如果希望修改一个元素值,必须先删除原有的元素,再插入新的元素。
- 头文件
#include<set>
set对象的默认构造
set<int> setlnt; //一个存放int的容器
set<float> setFloat; //一个存放float的容器
set<string> setString; //一个存放string的容器
set插入与迭代器
insert(a); //在容器中插入元素
begin(); //返回容器中第一个数据的迭代器
end(); //返回容器中最后一个数据之后的迭代器
rend(); //返回容器中倒数最后一个元素的后面的迭代器。
rbegin(); ////返回容器中倒数第一个元素的迭代器。
set排序
set默认按升序排序,如果想降序排序,可以:
set<int,greater<int> > setInt1;//按降序排序,注意最后`> >`中间有一个空格
set<int,less<int> > setInt2; //按升序排序
set删除
erase(value); //删除容器中值为value的元素
erase(it); //删除it迭代器所指的元素,返回下一个元素的迭代器
erase(beg,end); //删除区间[beg,end)的所有元素,返回下一个元素的迭代器
set查找
find(value); //在容器中查找值等于value的值,并返回指向value的迭代器
代码演示
#include<set>
#include<iostream>
#include<iterator>
using namespace std;
int main()
{
set<int,greater<int> > s; //降序排序
int a[6]={4,5,3,1,2,6};
int j=0;
while(i<sizeof(a)/sizeof(int)) //数组a插入到set集合中
{
s.insert(a[j]);
j++;
}
//迭代器输出集合中的元素
for(set<int>::iterator it=s.begin();it!=s.end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
set<int>::iterator i=s.find(3); //查找值为3的元素,并返回对应的迭代器
if(i!=s.end()) //如果查找成功,则删除
s.erase(i);
//再次输出集合中的元素
for (set<int>::iterator it = s.begin(); it != s.end(); it++)
{
cout << *it << " ";
}
cout<<endl<<s.size()<<endl; //输出集合中元素的个数
s.erase(2); //删除集合中值为2的元素
for (set<int>::iterator it = s.begin(); it != s.end(); it++)
{
cout << *it << " ";
}
cout<<endl<<s.size()<<endl;
s.erase(s.begin(),s.end()); //删除集合从头到尾之间的元素
cout<<s.size()<<endl; //输出0
return 0;
}
pair使用
- pair译为对组,可以将两个值视为一个单元
- pair<T1,T2>存放的两个值的类型,可以不一样,如T1为int,T2为float。T1,T2也可以是自定义类型。
- pair.first是pair里面的第一个值,是T1类型。
- pair.second是pair里面的第二个值,是T2类型。
equal_range(); //返回集合中与给定值相等的上下限的两个迭代器,上限是闭区间,下限是开区间,如[beg,end)。这两个迭代器,封装在pair中。
#include<set>
#include<iostream>
#include<iterator>
using namespace std;
int main()
{
set<int,less<int> > s; //按升序排列
int a[6]={4,5,3,1,2,6};
int j=0;
while(j<sizeof(a)/sizeof(int))
{
s.insert(a[j]);
j++;
}
for(set<int>::iterator it=s.begin();it!=s.end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
pair<set<int>::iterator,set<int>::iterator> pa=s.equal_range(3);
set<int>::iterator be=pa.first;
set<int>::iterator en=pa.second;
cout<<*be<<" "<<*en<<endl; //输出:3 4;左闭右开区间
return 0;
}
set重载
set也可以对自定义类型进行排序
例如:对一个(姓名,年龄)自定义类型按照年龄从小到大排序
#include<set>
#include<iostream>
#include<iterator>
using namespace std;
struct st
{
char name[10];
int age;
bool operator < (const st &y) const //重载<运算符
{
return age<y.age;
}
}p[5];
int main()
{
set<st> s;
for(int i=0;i<5;i++)
{
cin>>p[i].name>>p[i].age;
s.insert(p[i]);
}
for(set<st>::iterator it=s.begin();it!=s.end();it++)
{
cout<<it->name<<" "<<it->age<<endl;
}
return 0;
}
其他常用函数简介
clear(); //清除所有元素
count(); //返回某个值元素的个数(因为set容器中,元素不重复,所有只有0或1值,也即判断容器中是否存在某元素)
empty(); //判断容器是否为空
size(); //返回容器内元素的个数
swap(); //交换两个容器的元素