- 头文件
#include <set>
using namespace std;
- 定义
set<typename> name; //typename可以是任何基本类型
int
double
char
node(结构体)
容器 (vector, set, queue等)
set<typename> st[100]; //100个set容器数组 st[0] ~ st[99]都是一个set容器
- 访问 只能通过迭代器访问
迭代器 : set<typename>::iterator it; //类似指针 通过 *it 来访问 it可以
it++
不能*(it + i)only
vector
and
string
can do this
for(set<int>::iterator it = st.begin(); it != st.end(); it++) {
printf("%d", *it);
}
//不支持 it < st.end() 的写法
so
vi[i]
and
*(vi.begin() + i)
are equivalent
- Common functions:
(1) insert(x) //在set插入x,并自动递增排序和去重 O(logN)
(2) find(value) //返回set中对应value的迭代器it
如果找不到就会停在st.end()上面是一个空的迭代器 返回 st.end() O(logN)
x,y //第x个集合和第y个集合
int
totalNum = st[y].size(), sameNum = 0;
for
(set<
int
>::iterator it = st[x].begin(); it != st[x].end(); it++) {
if
(
st[y].find(*it) != st[y].end()
) sameNum++; // 判断x集合里的某一个元素 是否在y集合中存在
else
totalNum++;
}
(3) size() //返回set内元素个数 O(1)
(4) clear() //清空所有元素 O(N)
(5) erase(it) //删除迭代器it位置的元素 结合find() 函数使用 如: st.erase( st.find(100) ); 一定要有100这个元素 没有就等于删除 st.end() 位置的元素,会报错(因为没有元素)
erase(value) //删除set中值为value的元素 value可以不存在,这样就不会报错了 推荐使用这个
erase(first, last) //删除迭代器 [ first, last ) 内的所有元素 参数都是
迭代器
set<int>::iterator it = st.find(10); //若set中有 1 3 10 30 90
st.erase(it, st.end()); //删除元素30至set末尾之间的元素 即 10 30 90
- 主要用途:
自动去重并按升序排序