天天看點

STL algorithm算法nth_elements(41) std::nth_element

nth_element原型:

<algorithm>

std::nth_element

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

該函數是對範圍内的元素進行二分排序,以nth為分界點,前面的都比nth小,後面的都比nth大,但是隻是對前半部和後半部都不會嚴格排序。

使用operator進行排序。

适合尋找序列中前N個最大最小值。

也可以用來尋找第N+1小的值(排序後的nth值)。

一個簡單的例子:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
	vector<int> vi{0,1,2,3,4,5,6,7,8,9};
	cout<<"at first vi=";
	for(int i:vi)
		cout<<i<<" ";
	cout<<endl;
	nth_element(vi.begin(),vi.begin()+5,vi.end());
	cout<<"after nth_element(vi.begin(),vi.begin()+5,vi.end());"<<endl;
	cout<<"vi=";
	for(int i:vi)
		cout<<i<<" ";
	cout<<endl;
}
           

運作截圖:

STL algorithm算法nth_elements(41) std::nth_element

可以看到,前半部分都比vi.begin()+5(即位置為6,元素值是5)小,後面都比5大。

再一個測試的例子:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
	vector<int> vi{0,13,4,61,7,50,8};
	cout<<"at first vi=";
	for(int i:vi)
		cout<<i<<" ";
	cout<<endl;
	nth_element(vi.begin(),vi.begin()+3,vi.end());
	cout<<"after nth_element(vi.begin(),vi.begin()+3,vi.end());"<<endl;
	cout<<"vi=";
	for(int i:vi)
		cout<<i<<" ";
	cout<<endl;
	cout<<"第4小的元素為,vi.begin()+3="<<*(vi.begin()+3)<<endl;

}
           

運作截圖:

STL algorithm算法nth_elements(41) std::nth_element

——————————————————————————————————————————————————————————————————

//寫的錯誤或者不好的地方請多多指導,可以在下面留言或者點選左上方郵件位址給我發郵件,指出我的錯誤以及不足,以便我修改,更好的分享給大家,謝謝。

轉載請注明出處:http://blog.csdn.net/qq844352155

author:天下無雙

Email:[email protected]

2014-9-22

于GDUT

——————————————————————————————————————————————————————————————————

繼續閱讀