C++标准库set类型

来源:互联网 发布:范志毅数据 编辑:程序博客网 时间:2024/05/18 01:44

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的元素
0 0