set 是 C++ STL 中关于集合的库,和数学上的集合一样,元素具有唯一性,默认对元素从小到大进行排列。
注:multiset 中集合元素可以重复

能够进行一些集合操作,比如求交$\cap$,并$\cup$,差 等等。

一些基本操作

和其他大多数 STL 用法一样

set<int> s;
s.empty()    //判断是否为空,为空时返回 true
s.size()    //返回集合内元素个数
s.begin()    //第一个元素的地址
s.end()        //最后一个元素的后面的地址
s.clear()    //删除全部元素
s.insert()    //插入元素。
//可以插入数组中的元素,如 s.insert(a, a + n) 表示插入数组中下标从 0 到 n 的元素。
//由此可见它是能指定地址插入的。
s.erase()    //删除元素。可以指定元素,也可以指定地址,所以可以删除区间内的元素。
s.find()    //查找元素,返回的是它的地址,如果找不到返回 s.end()
s.count()    //返回某个元素的个数

初始化

默认是从小到大排序的,但我们可以这样强行让它从大到小排序
set<int, greater<int> >,其实默认的也等价于 set<int, less<int> >,第二个参数其实就是比较函数。
如何把一个数组强行转成 set 呢?像这样 set<int> s(a, a + n),就是把数组中下标为 0 到 n 的元素转到 set 中存起来。
所以初始化一个 set 时,可以直接用地址。
当然也可以复制另一个 set,比如 set<int> sb(sa)

迭代器

前向迭代器

set<int>::iterator it;
for(it = s.begin(); it != s.end(); it++)
    cout << *it << ' ';

嗯,这样是正向从前往后依次输出集合内的元素。

反向迭代器

set<int>::reverse_iterator rit;
for(rit = s.rbegin(); rit != s.rend(); rit++)
    cout << *rit << " ";

emmm,感觉没什么用。

修改

set 并没有修改这个东西,还是老老实实删除再重新插入吧。

一些高端操作

s.lower_bound()    //返回第一个大于等于某个值的元素的地址
s.upper_bound()    //返回第一个大于某个值的元素的地址
s.equal_range()    //返回一个 pair 类型的数对,包含上面两个函数的返回值

成员函数表格

我才不会告诉你是从网上偷的

Member functionsDefinition
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()返回一个用于比较元素间的值的函数