C++标准库set类型

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

你可能感兴趣的:(对象,实例)