STL 排序與檢索

2021-08-15 08:26:02 字數 2083 閱讀 6458

新增在標頭檔案algorithm中, 使用方法如:

sort(start,end[,排序方法])

int a[5] = ;

sort(a, a+5); //這是最簡單的sort方法, 使用預設的排序方法公升序排列

sort(a, a+5, cmp); // cmp為bool函式名, 是自定義規則比較函式

//自定義的cmp函式

bool cmp(int a, int b)

stl提供的一種bool二分搜尋函式, 使用方式為:

binary_search(start, end, argu);

if (binary_search(a, a+5, 3))

返回true或false

返回第乙個大於或等於x的第乙個位置

使用方法為:

lower_bound(start, end, x); //返回的是指標

一般這樣:

int a[5] = ;

int p = lower_bound(a, a+5, x) - a;

cout << a[p]; //p的值對應陣列a的下標

返回第乙個大於x的第乙個位置

使用方法為:

upper_bound(start, end, x); //返回的是指標

一般這樣:

int a[5] = ;

int p = upper_bound(a, a+5, x) - a;

cout << a[p]; //p的值對應陣列a的下標

參考書目見紫書p108, 以及網上各部落格

普通的二分查詢函式是對公升序的序列進行查詢的, 也就是對乙個降序序列查詢是錯誤的, 那麼這些函式和sort類似, 就應該新增乙個方法函式, 如:

bool cmp(int a, int b)

binary_search(a, a+1000, 33, cmp);

其他函式類似.

乙個綜合的應用如下

#include 

#include

#include

#include

using

namespace

std;

bool cmp(int a, int b)

int main()

; for( int i = 0; i < 1000; ++i )

cout

<< "sizeof a / int: "

<< sizeof(a)/sizeof(int) << endl;

sort(a, a+1000);

for( int i = 0; i < 1000; ++i )

if(binary_search(a, a+1000, 555))

sort(a, a+1000, cmp);

for( int i = 0; i < 1000; ++i )

if(binary_search(a, a+1000, 555, cmp))

int p = lower_bound(a, a+1000, 345, cmp) - a;

cout

<< "a[p] == "

<< a[p] << endl;

p = upper_bound(a, a+1000, 345, cmp) - a;

cout

<< "a[p] == "

<< a[p] << endl;

}

輸出結果為

sizeof a / int: 1000

yes ! there is 555

yes ! there is 555

a[p] == 345

a[p] == 344

STL初步 排序與檢索

e.g.現有n個大理石,每個大理石上寫了乙個非負整數。首先把每個數從小到大排序,然後回答q個問題。每個問題問是否有乙個大理石寫著某個整數x。如果是,要回答在哪個大理石上寫著x。排序後的大理石從左到右編號為1 n。solution 先排序,後查詢 關於排序 sort使用陣列元素預設的大小比較運算子進行...

c 排序與檢索函式

問題描述 現有n個大理石,每個大理石上寫了乙個非負整數 首先把各數從小到大排序 然後回答q個問題。每個問題問是否有乙個大理石寫著某個整數x,如果是,還要回答哪個大理石上寫著x。排序後的大理石從左到右編號為1 n。輸入大理石數量和需要回答問題數量,然後輸入大理石上的每個非負整數,接著輸入x 樣例輸入 ...

mysql怎麼排序檢索 mysql排序檢索資料

1 排序資料 select 表的欄位名 from 對應的表名 order by 表的欄位名 2 按多個列排序 select 表的欄位名,表的欄位名,表的欄位名,from 對應的表名 order by 表的欄位名,表的欄位名,表的欄位名,如果表的字段中的值是唯一的,則按照該欄位進行排序就可以了 3 指...