set(集合)和map一样也属于关联容器,和map不同的是它只保存关键字,而且关键字会按升序排序且不重复,set的内部实现是用红黑树实现的。接下来就为大家介绍set的用法
1.set对象的创建
事例如下
//尖括号中说明set保存关键字类型
set<int> s;
2.向set中添加元素
像其他容器一样,我们可以使用insert来向set中插入元素
实例如下
#include<iostream>
#include<set>
using namespace std;
int main(int argc,char **argv)
{
set<int> s;
//插入方式
s.insert(3);
//输出set中的元素
for(auto x:s)
{
cout<<x<<" ";
}
cout<<endl;
return 0;
}
注意由于set内部是默认排序的,所以我们不能直接改变set关键字的值(set中的关键字是只读的),若先改变则先删除在插入
3.set的删除
实例如下
#include<iostream>
#include<set>
using namespace std;
int main(int argc,char **argv)
{
set<int> s;
//插入方式
s.insert(3);
s.insert(4);
//删除关键字3
s.erase(3);
//输出set中的元素
for(auto x:s)
{
cout<<x<<" ";
}
cout<<endl;
return 0;
}
4.若set中的关键字为自定义类型
set容器中排序默认以升序的方式排序,所以它尖括号中的类型必须支持排序,如果是我们自定义的类型,则我们要为它定义一个我们自己的比较函数
实例如下
#include<iostream>
#include<set>
using namespace std;
//自定义类型
class Student
{
public:
int num; //学号
string name;//姓名
};
bool compare(const Student &s1,const Student &s2)
{
return s1.num < s2.num;
}
int main(int argc,char **argv)
{
//此处我们用decltype来获得函数指针类型,类型后面必须加上*来指出我们要用一个给定函数类型的指针
set<Student,decltype(compare) *> s(compare);
Student stu1,stu2;
stu1.num = 1;
stu1.name = "shreck";
stu2.num = 2;
stu2.name = "leo";
//插入stu1和stu2
s.insert(stu1);
s.insert(stu2);
for(auto x:s)
{
cout<<"num = "<<x.num<<" "<<"name = "<<x.name<<endl;
}
return 0;
}
5.set的几个重要操作函数
函数 | 作用 |
---|---|
find(k) | 返回一个迭代器,指向第一个关键字为k的元素,若k不存在则返回尾部迭代器 |
count(k) | 返回关键字等于k的元素数量,对于set返回值永远是0或1 |
lower_bound(k) | 返回一个迭代器,指向第一个关键字不小于k的元素 |
upper_bound(k) | 返回一个迭代器,指向第一个关键字大于k的元素 |