STL:划分与排序--3

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;
}

运行结果:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值