set译为集合,是一个内部自动有序且不含重复元素的容器

有时出现需要去掉重复元素的情况

而且有可能因这些元素比较大或者类型不是int型而不能直接开散列表

在这种情况下就可以用set来保留元素本身而不考虑它的个数

当然

上面的情况也可以再开一个数组进行下标和元素的对应来解决

但是set提供了更为直观的接口

并且加入set之后可以实现自动排序

头文件#include<set>

using namespace std;

1、set的定义

set<typename>name;

与vector相同,大部分STL都是这样的

2、set容器的访问

只能通过迭代器访问

set<typename>::iterator it;

可以通过*it来访问set里的元素

除开vector和string之外的STL容器都不支持*(it+i)的访问方式

只能按以下方式进行枚举

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<set>
using namespace std;
int main()
{
    set<int> st;
    st.insert(3);
    st.insert(5);
    st.insert(2);
    st.insert(3);
    for(set<int>::iterator it=st.begin();it!=st.end();it++)
    {
        printf("%d",*it);
    }
    return 0;
}

不支持it<st.end()的写法

可以发现,set内的元素自动递增排序,且自动去除了重复元素

3、set常用函数

(1)insert()

insert(x)可将x插入set容器中,并自动递增排序和去重

(2)find()

find(value)返回set中对应值为value的迭代器

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<set>
using namespace std;
int main()
{
   set<int> st;
   for(int i=1;i<=3;i++)
   {
     st.insert(i);  
   }
   set<int>::iterator it=find(2);
   printf("%d\n",*it);
    return 0;
}

(3)erase()

①删除单个元素

st.erase(st.find(100));

st.erase(value)

value就是所需要删除的值

②删除一个区间内的所有元素

st.erase(first,last)可以删除一个区间内的所有元素

其中first为所需要删除区间的起始迭代器,而last则为所需要删除区间的末尾迭代器的下一个地址

[first,last)

set<int>::iterator it=st.find(30);

st.erase(it,st.end());

删除元素30至set末尾之间的元素

(4)size()

用来获取set内元素的个数

(5)clear()

用来清空set中的所有元素

4、set的常见用途

set最主要的作用是自动去重并按升序排序,因此碰到需要去重但是不方便直接开数组的情况,可以尝试用set

延伸:

set中元素是唯一的,如果需要处理不唯一的情况

则需要使用multiset

C++11标准中还增加了unordered_set

以散列代替set内部的红黑树

(一种自平衡二叉查找树)

使其可以用来处理只去重但不排序的需求

速度比set快很多

知识点来自于《算法笔记》

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐