在這篇中,我會講幾個簡單易懂且比較常用的stl函數,這些函數在noip系列考試中往往被允許使用(既然讓用我們自然不用手碼了...)
(末尾有驚喜!)
1.sort
絕大部分剛入門的oier第一個接觸的stl函數就是sort函數,這是一個簡單而又快速的排序函數
通過內部集成的快速排序的代碼,可以在O(nlogn)的時間內完成一個長度為n的數列的排序(默認排序方向為由小到大)
實現起來非常簡單,代碼就一行(例子為排序x[1]~x[5]):
sort(x+1,x+5+1);//x表示你要排序的數組名,x+1表示從1開始(因為數組開始的默認下標為0)
//x+5+1表示到5結束(為什么要+1呢?因為我們要等於5,如果不+1的話意思是小於5的,自然就沒有x[5]了)
但同時,很多人會發現,你不是說這是默認由小到大的嗎?我要從大到小該怎么辦呢?
這時候我們有兩種選擇:你可以重載運算符,也可以寫一個比較函數
(前一個比較麻煩,我在下面一個講優先隊列時說)
我在這里先說一下比較函數
顧名思義,這個比較函數的作用就是告訴sort函數,我在排序時要怎樣對待每兩個元素
我們可以看一下這個比較函數的主體:
有了這個,我們就能讓sort隨心所欲!
總結:
函數名:sort
用途:排序一個數組
頭文件:#include<algorithm>
用法:sort(x+起始位置,x+終止位置+1,比較函數)(沒有特殊需要比較函數可以省略)
2.優先隊列
(在這個部分里,請大家默認將優先隊列當成堆)
大家玩過堆排序嗎?
優先隊列,其實就是堆排序,不過用起來會更方便(和上面一樣,一個函數與一行代碼的區別)
和sort拿來就能用不同,由於這是一個隊列,需要存東西,所以在使用前,我們需要聲明一下
比如說我要開一個堆,那我要這么做:
很簡單,不是嗎?那我們又該如何使用這個隊列呢?
下面我講幾個操作:
1.插入元素
我們可以這樣寫:
q.push(val);
q在這里代表隊列名稱,push是插入的意思,val則是你要插入的值
在這里我們要特別注意,val的類型必須和我們聲明的優先隊列的類型相同
(好像有時候隊列定義是long long你插個int也無所謂),但如果你定義的是int,但你從插的是個double,那么這個double會被強制取整
如果你定義的是結構體,你直接插入結構體就行(隊列會自動將結構體的每一個元素都插進去)
2.找堆頂
我們可以這樣寫:
int a=q.top();
這里的意思是定義一個整數為該堆的堆頂(不只是int,你定義的堆是什么類型,他就給你返回什么類型)
堆頂是什么取決於你如何重載運算符,(不過默認是大根堆)
3.刪除堆頂
我們可以這樣寫:
q.pop();
這句話表示堆頂元素出隊,然后程序會自動維護整個堆,使其仍滿足堆的性質
4.查詢堆的大小
我們可以這樣寫:
int a=q.size();
進行這個操作后a就代表堆的大小
該講講最重頭的了——重載運算符
重載運算符的作用就是改變某個序列中符號的定義
首先明確,在優先隊列里,由於他默認的是大根堆,所以我們重載大於號
依個人所見,如果你要將非結構體的大根堆變為小根堆,是不需要重載運算符的
我們只要在入隊時取反,出隊時取反即可(負負得正)
重載運算符,(我可能比較蒟蒻)一般重載的對象是結構體
我們一般這樣寫:
通過這樣一個函數,我們可以改變結構體數組中某些符號的含義,自然兩兩比較方式也就發生了改變
這個堆自然也就可以比較別的東西了
總結:
頭文件:#include<queue>
定義方法:priority_queue<int(數據類型)> q(隊列名)
用途:進行堆排序,構建一個二叉堆(至於有了堆能干什么,就看你們了)
操作:
push():插入元素
top():返回堆頂元素的值
pop():刪除堆頂元素
size():返回當前堆的大小
變形方式:重載運算符
3.雜項
本來這個地方想放vector的,但感覺好像並沒有什么卵用,於是我講一講雜項。
【1】 memset 數組初始化操作:
memset功能強大,但我在這里只講如何利用memset歸零一個數組
看圖:
就是這樣,是不是很簡單?
總結:
函數名:memset
頭文件:#include<cstring>
用途:初始化數組
用法:memset(數組名,初始值,大小);
【2】 strlen字符數組長度統計
有的時候,我們會遇到需要讀取一個不定長的字符串(比如說有的題讓你匹配字符串,像kmp,hash之類的)
我們就需要用一點手段獲取字符串的長度(當然,你別告我拿個循環跑,你多跑幾次就發現代碼行滿了)
我們請出strlen()函數
這個函數的作用就是讀取一個字符串,並返回這個字符串的長度
看圖:
通過如上函數,我們可以解決字符串的長度問題。
總結一下:
函數名:strlen
頭文件:#include<cstring>
用途:統計字符數組長度
用法:定義一個整數=strlen(你要統計長度的數列)
入門級c++stl到此結束,其實比較簡單的還有vector(變長數組),set(平衡樹,內部實現是一棵紅黑樹),map(映射,表示兩個數據間的關系),為了對新手更為友好,我就暫時不講。