set的常见用法详解
set译为集合,是一个内部自动有序且不含重复元素的容器有时出现需要去掉重复元素的情况而且有可能因这些元素比较大或者类型不是int型而不能直接开散列表在这种情况下就可以用set来保留元素本身而不考虑它的个数当然上面的情况也可以再开一个数组进行下标和元素的对应来解决但是set提供了更为直观的接口并且加入set之后可以实现自动排序头文件#include<set>...
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快很多
知识点来自于《算法笔记》
更多推荐
所有评论(0)