1.set的基本操作
set<int> s;
//1.插入元素
s.insert(3);
s.insert(4);
s.insert(2);
//2.集合中元素数量
int a = s.size();
2.set是一个集合,集合中元素具有唯一性(相同元素只保留一个)
set<int> s;
cout << s.size() << endl;
//0
s.insert(3);
cout << s.size() << endl;
//1
s.insert(4);
cout << s.size() << endl;
s.insert(4);
cout << s.size() << endl;
//这里输出肯定是 2 2
3.如果有重复元素,还想用set,怎么办?(可能有其他容器更好,作者只是入门菜鸟在学习)
方案一:用一个 pair 类型去封装
比如 pair<int,int> 我们多存储一个元素,来代表插入值的顺序,这样自然不会重复了
typedef pair<int,int> PII;
set<PII> s;
4.(重点)如何遍历元素?
※遍历时,元素输出的顺序是什么?
下面这种方法是按照首元素从小到大输出
//可以用 auto x : s
for(auto x : s) {
//根据集合中的类型去输出
}
5.模拟小顶堆
只需要解决两个问题
- 如何访问最小值 s.begin()
- 如何删除最小值 s.erase(s.begin())
这两个操作,加上insert()插入就完全够实现小顶堆
(其实c++里面有优先队列stl模版类,这里只是在学习set)
6.模拟大顶堆
很多种方法,重载啊什么都可以。
这里有一种不需要c++语言基础的方法——取负
每个元素a插入时,都插入 -a,这样最大的元素取负后反而是最小的了,就会在堆顶,这样我们访问时再取负,拿出来的就是最大值了