算法学习笔记——学习set,并去模拟堆

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,这样最大的元素取负后反而是最小的了,就会在堆顶,这样我们访问时再取负,拿出来的就是最大值了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值