c++stl應用入門


在這篇中,我會講幾個簡單易懂且比較常用的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(映射,表示兩個數據間的關系),為了對新手更為友好,我就暫時不講。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM