關於仿函數的文章
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;
}
};