定时器

制作一个定时器管理器,
需要下面的操作最快
(1)插入
(2)查找最小元素
(3)删除最小元素
最小堆正好符合这个要求,
STL中有两种选择:
(1)使用priority_queue
(2)使用heap函数
   make_heap
   push_heap
   pop_heap
显然是使用priority_queue更为简单.
但是priority_queue没有提供遍历和从中间删除的方法.
由于从普通查找和遍历都是O(n)复杂度,
要尽量少用,但是有时候还真不能少.
这时,
可以自己定义一个类,从priority_queue派生,
这样就可以直接操作内部的数据容器了.
比如:
template<typename T>
struct my_p : public std::priority_queue<T, std::vector<T>, std::greater<T> >
{

};


如果确实不愿意派生, 如果内部容器是vector, 那么top就是begin,再根据size,

也可实现遍历, 如果要修改其中的值, 需要const_cast类型转换, 感觉比较野蛮.



注意:
(1)由于heap是按照位置组织的, 不要直接在内部调用插入和删除操作.
当要删除一项的时候, 作为一个变通, 我们可以在数据中保存一个bDelete成员,

当检查到为true,则表示已经被删除直接略过处理.

(2)priority_queue默认是top是最大, 定时器需要top最小, 需要把默认的比较函数less改为greater.

     如果保存的自定义的结构体, 自定义比较函数的时候也要注意.


后来看到,如果是CLR, 可以用 get_container 获取内部容器.


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值