亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

求解,c++ 關于nth_element()的問題,具體詳情請看下面?

求解,c++ 關于nth_element()的問題,具體詳情請看下面?

慕勒3428872 2021-05-26 10:19:13
#include<iostream>#include<cstdlib>#include<vector>#include<string>#include<algorithm>using namespace std;//typedeftypedef int I;typedef char C;typedef int ARR[10];//宏定義#define N 3#define X(a,b) (((a)+(b))*3)//自定義函數聲明void f1();void output(const string &);void f2();//主函數int main(int argc,char * argv[]){f1();cout<<endl;f2();cout<<endl;cout<<argc<<ends<<* argv<<endl;system("pause");return 0;}//自定義函數 在output函數里不能改變x的值,因為constvoid output(const string & x){cout<<x<<endl;}void f1(){//定義vector對象vector<string> strVect1;vector<string> strVect2;//push_back()strVect1.push_back("Sunday");strVect1.push_back("Monday");strVect1.push_back("Over");strVect1.push_back("Wednesday");strVect2.push_back("Monday");strVect2.push_back("Sunday");strVect2.push_back("Over");strVect2.push_back("Saturday");//sort()sort(strVect1.begin(),strVect1.end());sort(strVect2.begin(),strVect2.end());cout<<"Vect1:"<<endl;//for_each()for_each(strVect1.begin(),strVect1.end(),output);cout<<endl;cout<<"Vect2:"<<endl;for_each(strVect2.begin(),strVect2.end(),output);cout<<endl;cout<<"bool result=includes(strVect1.begin(),strVect1.end(),strVect2.begin(),strVect2.begin()+2):"<<endl;//includes()bool result=includes(strVect1.begin(),strVect1.end(),strVect2.begin(),strVect2.begin()+2);if(result)cout<<"result:OK"<<endl;elsecout<<"result:ERROR"<<endl;}void f2(){//定義vector對象vector<I> intVect;//push_back()intVect.push_back(7);intVect.push_back(3);intVect.push_back(9);intVect.push_back(1);intVect.push_back(0);intVect.push_back(6);intVect.push_back(5);cout<<"intVect"<<endl;//定義iterator對象vector<I>::iterator it;for(it=intVect.begin();it!=intVect.end();it++)cout<<* it<<ends;cout<<endl;//nth_element()nth_element(intVect.begin(),intVect.begin()+3,intVect.end());for(it=intVect.begin();it!=intVect.end();it++)cout<<* it<<ends;cout<<endl;}
查看完整描述

1 回答

?
米琪卡哇伊

TA貢獻1998條經驗 獲得超6個贊

nth_element()是一個典型的部分排序算法。

它的第1和第3個參數,定義的是排序的范圍(或則說nth_element這個算法或函數的作用范圍),稱著first和last,是一個[ )區間。在你的例子,分別對應那個vector的begin和end;

第2個參數的意思是:如果一個序列的first和last半包含的范圍內,如果這個序列被排序了,那個第n個位置上的元素應該是什么。---- 白話的解釋就是:如果給你一堆數據,我想看看中間值是多少,第2大的數是什么? 你該如何解決呢? 全排序當然可以,但如果數據多,效率也許就差了。這是只有部分排序即可,也就是說只有這第n個的位置被排對了,那么其他的就不管了,排序就可以解釋了。-- 這是nth_element的應用意義。


以你的代碼為例:你的第2個參數是intVect.begin()+3,就是想看看intVect這個序列中,【如果排序的話】,它的第4個應該是多少?這個intVect如果全排序,應該是:

0 1 3 5 6 7 9,

因此nth_element在確保第4個元素=5的時候,就停止排序了。 因此你后面輸出intVect的值是:

1 0 3 5 9 6 7

就是第4個=5后,當時intVect的值。

一般在nth_element()后,都有一個類似這樣的語句:

12nth_element(intVect.begin(),intVect.begin()+3,intVect.end());cout << intVect[3]<< endl;

給你添加一點代碼,體會一下nth_element的概念,它其實可以有【第4個參數】的:

1234nth_element(intVect.begin(), intVect.begin() + intVect.size()/2, intVect.end());cout << "The median is " << intVect[intVect.size()/2] << endl;nth_element(intVect.begin(), intVect.begin() + 1, intVect.end(), greater<int>());cout << "The second largest is " << intVect[1] << endl;

之后在看看intVect的輸出:

123The median is 5The second largest is 79 7 6 5 3 1 0



查看完整回答
反對 回復 2021-05-31
  • 1 回答
  • 0 關注
  • 346 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號