sort 的基本應用

2021-10-19 05:40:08 字數 3547 閱讀 2346

sort()是c++ stl裡面乙個非常棒的函式,不僅是乙個模板函式,還可以自動根據資料多少選擇最佳的排序方式。

#include

using

namespace std;

sort

(a, a + n, cmp)

;

sort()一共可以接收三個引數:

第乙個是首位址,如果是陣列的話,去掉下標即可。如a[1000]的首位址為a[0]或者a。

第二個引數為資料範圍,或者說尾位址更確切一下。如果要對a[1000]進行排序,如果是範圍的話,那麼只需要寫1000即可。但是我們填寫的引數往往是a + 1000。如果是對乙個string變數s進行排序,我們可以直接使用s.end()作為第二個引數。

第三個引數作為擴充套件可以實現更強大的功能。

比如sort()預設是對資料進行公升序排序,但是我們可以通過第三個引數,將其變為降序排序。

還有當我們對某種復合型別進行排序時,往往會有多種排序依據,我們可以通過第三個引數來指定根據復合型別的具體的資料進行排序。

下面是sort()的使用舉例:

#include

using

namespace std;

//對a[1000]進行公升序排序

sort

(a, a +

1000);

//對a[1000]中的n個資料進行公升序排序

sort

(a, a + n)

;//對a[1000]中的n個資料進行降序排序 使用第三個引數

bool

cmp(

int a,

int b)

sort

(a, a + n, cmp)

;//對string變數s的排序

sort

(s.begin()

, s.

end())

;//或者是

sort

(s, s.

end())

;//結構體的排序

//定義了乙個名為boy的結構體,三種資料型別為string name, int age, double height;

struct boy

;boy b[

1000];

//對名字進行排序

bool

cmp1

(boy b1, boy b2)

sort

(b, b + n, cmp1)

;//可以根據boy的name屬性進行降序排序

//bool

cmp2

(boy b1, boy b2)

sort

(b, b + n, cmp2)

;//可以根據boy的age屬性進行公升序排序

//bool

c***

(boy b1, boy b2)

sort

(b, b + n, c***)

;//可以根據boy的height屬性進行降序排序

2021.2.9 擴充內容

如果你已經看懂了上面所有的內容,那麼你可以看一下下面這些內容。

sort()其實是基於迭代器的排序函式,也就是說它只對位址進行操作,而不是對容器進行操作,所以它才不會受容器或者元素型別的限制。

關於sort()函式的第三個引數,實際上是乙個謂詞——乙個可以呼叫的表示式,其返回結果是乙個能用作條件的值。

如果你覺得上面利用cmp作為第三個引數的形式並不美觀,那麼你完全可以使用lambda表示式來進行替換。

關於lambda表示式在這裡不細說,以後另外開個帖子好好說一下吧。

但是你必須要知道lambda表示式只有c++11以上的版本才支援。

比如上面那個對a[1000]的陣列進行排序的例子,可以改寫為以下

int a[

1000];

sort

(a, a + n,

(int a,

int b));

//是捕獲列表,其他內容都與函式一樣,只不過需要注意的是lambda表示式使用尾置返回指定返回型別。

//也就是說返回型別可以隱藏,由編譯器自動判別。但是你一定要指定返回型別的話,可以寫成下面這個樣子。

sort

(a, a + n,

(int a,

int b)

->

bool

);

除了以上這些內容之外,繼續補充乙個sort的用法:根據字串長短排序。

//法一:

bool

cmp(

const string &s1,

const string &s2)

string s[

1000];

sort

(s, s + n, cmp)

;//法二:

bool

cmp(string &s1, string &s2)

string s[

1000];

sort

(s, s + n, cmp)

;//法三:

string s[

1000];

sort

(s, s + n,

(const string &s1,

const string &s2));

//法四:

string s[

1000];

sort

(s, s + n,

(string &s1, string &s2)

);

上面四種方法都可以達到我們想要的目的,但是我最推薦的還是第1種和第3種。下面是我寫的測試**以及測試結果。

#include

#define ll long long

#define ld long double

using

namespace std;

bool

cmp(

const string &s1,

const string &s2)

bool

cmp1

(string &s1, string &s2)

intmain()

);//使用方法三將字串按照由長到短排序,並輸出

for(

int i =

0; i < n;

++ i) cout << s[i]

<< endl;

sort

(s, s + n,

(string &s1, string &s2));

//使用方法四將字串按照由短到長排序,並輸出

Tomcat的基本應用

1 測試tomcat 啟動tomcat 在瀏覽器中輸入 2 tomcat的管理 tomcat 的服務管理頁面是 的應用程式管理頁面 3 發布應用程式 jsp應用程式 war有二種方式,一種是按一定的目錄結構組織檔案,一種是乙個字尾為 war的壓縮包,因此它的部署方式也有兩種 1 在瀏覽器中輸入 就會...

QTreeWidget的基本應用

基於qt 4.8.4,vs2010 官方文件 qtreewidget控制項用於顯示樹形結構。在程式中使用它,需要做兩件事 1.定義事件和響應函式 2.樹結構資料的輸入輸出 1.定義事件和響應函式 在ui編輯器中建立乙個qtreewidget控制項,在 訊號 槽編輯器 中為控制項新增訊號 接收者 槽。...

陣列的基本應用

陣列 是一組相關資料的集合,乙個陣列實際上就是一連串的變數,陣列按照使用可以分為一維陣列 二維陣列 多維陣列。一維陣列 儲存相同資料型別的資料集合。宣告 常用 a arr null 少用 a arr null.定義 動態 arr new a length 靜態常用 arr 靜態少用 arr new ...