nth_element(beg, nth, end)
nth_element(beg, nth, end, comp)
default (1)
template <class RandomAccessIterator>
void nth_element (RandomAccessIterator first, RandomAccessIterator nth,
RandomAccessIterator last);
custom (2)
template <class RandomAccessIterator, class Compare>
void nth_element (RandomAccessIterator first, RandomAccessIterator nth,
RandomAccessIterator last, Compare comp);
功能:重排容器中的元素[first,last),nth所指的元素即为该位置出的有序元素,其前面的元素均满足小于或大于该元素,但不一定有序;其后的元素均满足大于或小于该元素,但不一定有序。
可实现快速确定第K个有序元素,或者输出前K个有序元素(不要求顺序输出)
其原理也是基于快速排序的思想。
参数:first,nth,last均为迭代器,因此若nth=begin+5,实际上nth所指的元素是下标为5的元素(即第6个有序元素)
comp为二元函数,返回值为bool;
#include <iostream>//std::cout
#include<functional>
#include<vector>//vector
using namespace std;
bool myOperation(int a,int b){
return a<b;
}
struct obj{
bool operator() (int a,int b){
return a<b;
}
}myobject;
int main(int argc,char** argv){
vector<int> myVector;
for(int i=1;i<10;i++){//1,2,3,4,5,6,7,8,9
myVector.push_back(i);
}
//output the elements in the vector
random_shuffle(myVector.begin(),myVector.end());//打乱容器中元素顺序
for(vector<int>::iterator iter=myVector.begin();iter!=myVector.end();iter++){
cout<<*iter<<" ";
}
cout<<endl<<endl;
//using default comparison
nth_element(myVector.begin(),myVector.begin()+5,myVector.end());
for(vector<int>::iterator iter=myVector.begin();iter!=myVector.end();iter++){
cout<<*iter<<" ";
}
cout<<endl;
//using function as comp
random_shuffle(myVector.begin(),myVector.end());
nth_element(myVector.begin(),myVector.begin()+5,myVector.end(),myOperation);
for(vector<int>::iterator iter=myVector.begin();iter!=myVector.end();iter++){
cout<<*iter<<" ";
}
cout<<endl;
//using object as comp
random_shuffle(myVector.begin(),myVector.end());
nth_element(myVector.begin(),myVector.begin()+5,myVector.end(),myobject);
for(vector<int>::iterator iter=myVector.begin();iter!=myVector.end();iter++){
cout<<*iter<<" ";
}
cout<<endl;
//using function object as comp
random_shuffle(myVector.begin(),myVector.end());
nth_element(myVector.begin(),myVector.begin()+5,myVector.end(),
less<int>());
for(vector<int>::iterator iter=myVector.begin();iter!=myVector.end();iter++){
cout<<*iter<<" ";
}
cout<<endl;
return 0;
}
运行结果: