制作一个定时器管理器,
需要下面的操作最快
(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> >
{
注意:
(1)由于heap是按照位置组织的, 不要直接在内部调用插入和删除操作.
当要删除一项的时候, 作为一个变通, 我们可以在数据中保存一个bDelete成员,
需要下面的操作最快
(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 获取内部容器.