set翻译为集合,是一个内部自动有序且不含重复元素的容器。在考试中,有可能出现需要去掉重复元素的情况,而且有可能因这些元素比较大或者类型不是int型而不能直接开散列表,在这种情况下就可以用set来保留元素本身而不考虑它的个数。当然,上面说的情况也可以通过再开一个数组进行下标和元素的对应来解决,但是set提供了更为直观的接口,并且加入set之后可以实现自动排序,因此熟练使用set可以在做某些题时减少思维量。
如果要使用set,需要添加set头文件,即#include<set>。除此之外,还需要在头文件下面加上一句:“using namespace std;”,这样就可以在代码中使用set了。
1.set的定义
单独定义一个 set:
set<typename> name;
其定义的写法其实和vector基本是一样的,或者说其实大部分STL都是这样定义的,这里的typename依然可以是任何基本类型,例如int,double,char,结构体等,或者是STL标准容器,例如vector、set、queue等。
2.set 容器内元素的访问
set只能通过迭代器(iterator)访问:
set<typename>::iterator it;
typename 就是定义set时填写的类型,下面是typename为int和char的举例:
set<int>::iterator it;
set<char>::iterator it;
这样就得到了迭代器it,并且可以通过*it来访问set里的元素。
由于除开 vector和string之外的STL 容器都不支持*(it+i)的访问方式,因此只能按下方式枚举:
#include <stdio.h>
#include <set>
using namespace std;
int main() {
set<int> st;
st.insert(3); //insert(x)将x插入set中
st.insert(5);
st.insert(2);
st.insert(3);
//注意,不支持it< st()的写法
for(set<int>::iterator it=st.begin();it!=st.end();it++){
printf("%d", *it);
}
return 0;
}
输出结果:
2 3 5
可以发现,set内元素自动排序(递增),且已经去重。
3.set内常用函数:
begin() 返回指向第一个元素的迭代器
clear() 清除所有元素
count() 返回某个值元素的个数
empty() 如果集合为空,返回true(真)
end() 返回指向最后一个元素之后的迭代器,不是最后一个元素
equal_range() 返回集合中与给定值相等的上下限的两个迭代器
erase() 删除集合中的元素
find() 返回一个指向被查找到元素的迭代器
get_allocator() 返回集合的分配器
insert() 在集合中插入元素
lower_bound() 返回指向大于(或等于)某值的第一个元素的迭代器
key_comp() 返回一个用于元素间值比较的函数
max_size() 返回集合能容纳的元素的最大限值
rbegin() 返回指向集合中最后一个元素的反向迭代器
rend() 返回指向集合中第一个元素的反向迭代器
size() 集合中元素的数目
swap() 交换两个集合变量
upper_bound() 返回大于某个值元素的迭代器
value_comp() 返回一个用于比较元素间的值的函数