关于仿函数的文章
http://blog.csdn.net/sicofield/article/details/9050833
http://blog.csdn.net/chyuanzheng/article/details/7837165
二元仿函数(来自第一个链接)
等于:equal_to<T>
不等于:not_equal_to<T>
大于:greater<T>
大于等于:greater_equal<T>
小于:less<T>
小于等于:less_equal<T>
------------------------------------------------------------------------
/*参考书上思路,P289
用大小堆来实现
###max,min###
1 2,3 5 4
左右个数差1或者相等 (#所代表的数字无序)
!! pay attention to
判断奇偶数的时候一定要括号,用&的话
(size&1)==1
*/
class Solution {
vector<int>min,max;
public:
void Insert(int num)
{
if(((min.size()+max.size())&1)==0)//偶数个,加入最小堆
{
if(max.size()>0&&num<max[0])
{
max.push_back(num);
push_heap(max.begin(),max.end(),less<int>());//调整最大堆
/*新添加一个元素在末尾,然后重新调整堆序。也就是把元素添加在底层vector的end()处*/
num=max[0];
pop_heap(max.begin(),max.end(),less<int>());//删除最大堆的最大值
/*把堆顶元素取出来,放到了数组或者是vector的末尾,用原来末尾元素去替代*/
max.pop_back();
}
min.push_back(num);
push_heap(min.begin(),min.end(),greater<int>());
}
else
{
if(min.size()>0 && num>min[0])
{
min.push_back(num);
push_heap(min.begin(),min.end(),greater<int>());
num=min[0];
pop_heap(min.begin(),min.end(),greater<int>());
min.pop_back();
}
max.push_back(num);
push_heap(max.begin(),max.end(),less<int>());
}
}
double GetMedian()
{
int size=min.size()+max.size();
if(size==0)return 0;
double m=0;
if((size&1)==1)//奇数
m=min[0];
else m=(min[0]+max[0])/2.0; //m是小数,所以是/2.0 不是/2
return m;
}
};