nth_element 使用小例

本文展示了一个使用C++标准库函数nth_element的例子,该函数用于部分排序容器中的元素,以便第n个元素位于其应该在完全排序容器中的位置。示例中包括使用greater<int>()进行降序排列和使用自定义比较函数MoreThan进行排列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <vector>
#include <algorithm>
#include <functional>      // For greater<int>( )
#include <iostream>
using namespace std;
// Return whether first element is greater than the second
struct MoreThan: public binary_function<int,int,bool> {
 bool operator()(const int& a1,const int& a2) const {return a1 > a2;}
};

// bool UDgreater (const int elem1,const int elem2 )
// {
//  return elem1 > elem2;
// }

int main( )
{
 using namespace std;
 vector <int> v1;
 vector <int>::iterator Iter1;

 int i;
 for ( i = 0 ; i <= 5 ; i++ )
 {
  v1.push_back( 3 * i );
 }

 int ii;
 for ( ii = 0 ; ii <= 5 ; ii++ )
 {
  v1.push_back( 3 * ii + 1 );
 }

 int iii;
 for ( iii = 0 ; iii <= 5 ; iii++ )
 {
  v1.push_back( 3 * iii +2 );
 }

 cout << "Original vector:\n v1 = ( " ;
 for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
  cout << *Iter1 << " ";
 cout << ")" << endl;

 nth_element(v1.begin( ), v1.begin( ) + 3, v1.end( ) );
 cout << "Position 3 partitioned vector:\n v1 = ( " ;
 for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
  cout << *Iter1 << " ";
 cout << ")" << endl;
 cout << "Position 3 Value is " << v1.at(3) <<endl;

 // To sort in descending order, specify binary predicate
 nth_element( v1.begin( ), v1.begin( ) + 4, v1.end( ),
  greater<int>( ) );
 cout << "Position 4 partitioned (greater) vector:\n v1 = ( " ;
 for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
  cout << *Iter1 << " ";
 cout << ")" << endl;
 cout << "Position 4 Value is " << v1.at(4) <<endl;

 random_shuffle( v1.begin( ), v1.end( ) );
 cout << "Shuffled vector:\n v1 = ( " ;
 for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
  cout << *Iter1 << " ";
 cout << ")" << endl;

 // A user-defined (UD) binary predicate can also be used
 nth_element( v1.begin( ), v1.begin( ) + v1.size()/2, v1.end( ), MoreThan());
 cout << "Position 5 partitioned (UDgreater) vector:\n v1 = ( " ;
 for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
  cout << *Iter1 << " ";
 cout << ")" << endl;

 cout << "mid Position Value is " <<  v1.at(v1.size()/2) <<endl;

 system("pause");
 return 0;
}

转载于:https://my.oschina.net/imtoby/blog/71330

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值