题目:输入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;
}