题目:输入n个整数,输出其中最小的k个。
例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。
晕了,发现自己有很多东西都还需要学,最郁闷的就是谓词那里了......
//make_heap //谓词的使用 #include<iostream> #include<algorithm> #include<vector> #include <functional> using namespace std; void find(vector<int> &a,int n){ make_heap(a.begin(),a.begin()+n); if(a.size()<n) return; for(vector<int>::size_type i=n;i<a.size();i++){ if(a[i]<a[0]){ a[0]=a[i]; make_heap(a.begin(),a.begin()+n); } } for(vector<int>::size_type i=0;i<n;i++) cout<<a[i]<<" "; cout<<endl; nth_element(a.begin(),a.begin(),a.end(),less<int>());//最后传递的是一个对象 for(vector<int>::size_type i=0;i<n;i++) cout<<a[i]<<" "; cout<<endl; } int main(void){ vector<int> a; for(int i=1;i<=8;i++) a.push_back(i); find(a,4); system("pause"); return 0; }
最让人郁闷的是nth_element的地方,就是cmp函数的问题,这个东西从大一开始用qsort函数就一直有了,代码出错了N次,改成下面这个也可以用了
bool cmp(int &a,int &b){ return a < b; } void find(vector<int> &a,int n){ make_heap(a.begin(),a.begin()+n); if(a.size()<n) return; for(vector<int>::size_type i=n;i<a.size();i++){ if(a[i]<a[0]){ a[0]=a[i]; make_heap(a.begin(),a.begin()+n); } } for(vector<int>::size_type i=0;i<n;i++) cout<<a[i]<<" "; cout<<endl; nth_element(a.begin(),a.begin(),a.end(),cmp);//改成cmp for(vector<int>::size_type i=0;i<n;i++) cout<<a[i]<<" "; cout<<endl; }